有关 python 切片的趣事
哈喽大家好,我是咸鱼
今天来讲一个我在实现 python 列表切片时遇到的趣事
在正式开始之前,我们先来了解一下切片(slice)
切片操作是访问序列(列表、字符串......)中元素的另一种方法,它可以访问一定范围内的元素,通过切片操作,可以生成一个新的序列
语法如下
name[start : end : step]
- start 是切片的起始索引值,当 start 是序列首位时可以省略
- end 是切片结束索引值,当 end 是序列末位时可以省略
- step 为步长,可以不提供,默认是1,不能为0,为负数时表示列表翻转
需要注意的是,切片操作遵循包头不包尾的原则,即从序列的第 start 位索引起,向右取到后 end-1 位元素为止,按 m 间隔过滤
下面举一些关于切片的例子
# 获取列表的前 n 个元素:
lst = [1, 2, 3, 4, 5, 6]
n = 3
result = lst[:n]
print(result) # [1, 2, 3]
# 获取列表的后 n 个元素:
lst = [1, 2, 3, 4, 5, 6]
n = 3
result = lst[-n:]
print(result) # [4, 5, 6]
# 获取列表中的偶数元素:
lst = [1, 2, 3, 4, 5, 6]
result = lst[1::2]
print(result) # [2, 4, 6]
# 获取列表中的奇数元素:
lst = [1, 2, 3, 4, 5, 6]
result = lst[::2]
print(result) # [1, 3, 5]
# 获取列表中的倒数第二个元素:
lst = [1, 2, 3, 4, 5, 6]
result = lst[-2:-1]
print(result) # [5]
# 获取列表中的最后两个元素:
lst = [1, 2, 3, 4, 5, 6]
result = lst[-2:]
print(result) # [5, 6]
根据 GPT 的回答,Fortran 是最早支持切片语法的语言,历史上曾经有多种语言支持切片操作

上面这些语言虽然说都支持切片语法,但我觉得不够 python 那样的灵活简洁
- 简洁而直观的语法:
Python 的切片语法非常简洁和直观,使用起来非常方便。通过使用冒号(:)来指定起始位置、结束位置和步长,可以轻松地进行切片操作。
- 强大的切片功能:
Python 的切片语法不仅支持基本的切片操作,还可以使用负数索引和省略号(...)来处理更复杂的情况。这使得对列表、字符串、元组等序列类型的数据进行灵活的切片成为可能
再介绍完了切片之后,我们来进入正题,那天咸鱼在写一个关于列表切片操作的文档
现象
我们知道:根据单个索引进行取值时,如果索引越界,就会报错
list1 = [1,2,3]
print(list1[5])
"""
报错信息如下:
Traceback (most recent call last):
File "E:\PycharmProjects\projects\demo\草稿纸.py", line 2, in <module>
print(list1[5])
IndexError: list index out of range
"""
但是当咸鱼不小心将切片结束索引值设置成了超过了列表长度的值的时候,发现居然没有报错
list1 = [1,2,3]
print(list1[1:5]) # 结果[2, 3]
是不是很有趣,Python 中的切片操作不会引发索引越界的错误
关于这个现象,官方文档里面是有介绍的
The slice of s from i to j is defined as the sequence of items with index k such that
i <= k < j. If i or j is greater thanlen(s), uselen(s).If i is omitted or
None, use0. If j is omitted orNone, uselen(s). If i is greater than or equal to j, the slice is empty.
也就是说,对于序列 s :
- 当初始索引值或者结束索引值大于序列长度时,就用长度值(
len(s))作为索引值 - 当初始索引值没写或者是 None 时,用 0 作为初始索引值
- 当结束索引值没写或者是 None 时,用序列长度值(
len(s))作为初始索引值 - 当初始索引值大于等于结束索引值时,结果为空对象
my_list = [1, 2, 3, 4, 5]
# 有效的切片范围
print(my_list[1:4]) # 输出: [2, 3, 4]
# 超出索引范围的切片,会自动调整为有效的索引
print(my_list[1:10]) # 输出: [2, 3, 4, 5]
# 负数索引也适用
print(my_list[-3:10]) # 输出: [3, 4, 5]
总结
Python 的切片语法设计得很安全,即使指定的切片索引超出了序列的长度,也不会引发索引越界错误。相反,它会自动调整切片范围,只返回有效的结果
当进行切片操作时,Python会根据切片的参数和可用的索引范围来确定切片的实际范围
虽然不知道龟哥为什么设计 Python 的切片语法要允许索引超出边界,而不是设计成抛出索引错误?
但是可以知道的是,这种设计使得切片操作更加灵活和方便,无需手动检查索引范围或引发索引越界异常
它允许我们在切片操作中不必担心边界情况,并且可以更加简洁地处理列表、字符串和其他序列类型的操作
有关 python 切片的趣事的更多相关文章
- 关于javascript里面仿python切片操作数组的使用方法
其实在使用了好一段时间的 python之后,我觉得最让我念念不忘的并不是python每次在写函数或者循环的时候可以少用{}括号这样的东西(ps:其实也是了..感觉很清爽,而且又开始写js的时候老是想用 ...
- 流畅的Python——切片
2.4 切片 在 Python 里,像列表(list).元组(tuple)和字符串(str)这类序列类型都支持切片操作,但是实际上切片操作比人们所想象的要强大很多. 在我个人的使用经历来看,在算法实践 ...
- Python切片(入门7)
转载请标明出处: http://www.cnblogs.com/why168888/p/6407977.html 本文出自:[Edwin博客园] Python切片 1. 对list进行切片 L = r ...
- 彻底搞懂Python切片操作
在利用Python解决各种实际问题的过程中,经常会遇到从某个对象中抽取部分值的情况,切片操作正是专门用于完成这一操作的有力武器.理论上而言,只要条件表达式得当,可以通过单次或多次切片操作实现任 ...
- python 切片步长
python切片 切片:list变量[值下标:结束值下标] 什么意思呢? 就是获取 list中 下标从定义的位置开始获取数据到 自定义的下标位置结束, 但是切片有个规矩就是顾头不顾尾, 举个例子 ...
- 关于python切片操作笔记
一. Python可切片对象的索引方式 包括:正索引和负索引两部分,如下图所示,以a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例: python索引方式.jpg 二. P ...
- 详解Python 切片语法
Python的切片是特别常用的功能,主要用于对列表的元素取值.这篇文章主要介绍了详解Python 切片语法,需要的朋友可以参考下 Python的切片是特别常用的功能,主要用于对列表的元素取值.使用切片 ...
- 深入理解Python切片
Python序列的切片很基础同时也很重要,最近看到一个[::-1]的表达,不明所以,查了一些资料并实际操作,对Python切片有了更深刻的认识,以下结合例子详细说明.先看下切片的基本语法,一般认为切片 ...
- Python切片
切片是啥, 可以吃么 切片肿么用哈 辣么长,记不住 切片是啥, 可以吃么 嘛,所谓切片故名思意就有选取的意思啦, 跟java里面的subString()意思差不多, 从原始的字符串中按规则提取出新的字 ...
- python 切片
本人的博客中的python内容基本上全是看着廖雪峰大神博客做的一个笔记 关于列表或者元祖的切片 下面说一下列表的切片的语法: L[起始位置:结束位置:步长] number = range(100) n ...
随机推荐
- 为什么说 ICMP 协议是网络最强辅助
大家好,我是风筝 轻解网络系列又来了.已有高清 PDF 版本可以离线阅读了,全册 65 页,如果有需要离线版的高清 PDF 可以直接下载. 今天咱们说说 ICMP 协议.ICMP 可谓是网络世界中的最 ...
- Rancher系列文章-Rancher v2.6使用脚本实现导入集群
概述 最近在玩 Rancher, 先从最基本的功能玩起, 目前有几个已经搭建好的 K8S 集群, 需要批量导入, 发现官网已经有批量导入的文档了. 根据 Rancher v2.6 进行验证微调后总结经 ...
- Excel的读取保存案例
python进行excel处理 1. Excel读取 # 首先导入pandas工具包 import pandas as pd # 读取Excel df = pd.read_excel('./excel ...
- 每日复习------main()方法以及对象的初始化顺序
由于 Java 虚拟机需要调用类的 main()方法,所以该方法的访问权限必须是 public,又因为 Java 虚拟机在执行 main()方法时不必创建对象,所以该方法必须是 static 的,该方 ...
- [数据库/Java SE]MySQL驱动包(mysql-connector-java.jar)问题[com.mysql.jdbc.Driver/org.gjt.mm.mysql.Driver/com.mysql.cj.jdbc.Driver]
MySQL的驱动JAR包----mysql-connector-java.jar,不同版本,其JBDC驱动类Driver的路径均有可能变化. 日后使用时,可根据本文的思路,有依据地进行检查(而不是随便 ...
- [Linux]常用命令之【netstat/ps/lsof/ss/kill/】#进程/服务/端口#
查看系统中最近的端口连接记录 [root@sdc01 ~]# lsof -Pnl +M -i4 | grep "154" sshd 30963 0 3u IPv4 65160732 ...
- Vue 环境准备
近期接触了下前端项目,记录下学习过程. 近几年前端发展的迅猛,各种框架层出不穷,vue react angular ,各种第三方组件 原来会点js,jQuery 前后端一个人全搞定了,现在前后端分离, ...
- Java 开源项目整合
在JAVA学习过程中,学习到的简单项目,在这里记录下. SSM框架的整合 使用到的框架:SpringMVC + Spring + MyBatis 地址:https://github.com/liyif ...
- 【LeetCode回溯算法#extra01】集合划分问题【火柴拼正方形、划分k个相等子集、公平发饼干】
火柴拼正方形 https://leetcode.cn/problems/matchsticks-to-square/ 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] ...
- day14:列表/集合/字典推导式&生成器表达式&生成器函数
推导式 推导式的定义: 通过一行循环判断,遍历一系列数据的方式 推导式的语法: val for val in Iterable 三种方式: [val for val in Iterable] {val ...