《老鸟python 系列》视频上线了,全网稀缺资源,涵盖python人工智能教程,爬虫教程,web教程,数据分析教程以及界面库和服务器教程,以及各个方向的主流实用项目,手把手带你从零开始进阶高手之路!点击 链接 查看详情




切片

阅读:227568828    分享到

比如我们取一个有序集合 list 类型的变量 L 的前 2 个元素做为一个集合,可以用 [L[0],L[1]] 这种方法,如果要取前 N 个元素,但是 N 很大,我们就需要一个个列出来或者用循环操作等,这样就会可读性差或者操作麻烦等等。

Python 提供了取有序集合(str,list,tuple 或支持通过下标访问的自定义对象)子集的语法,就是切片。

正向切片(从左往右取子集)

对于有序集合 L,我们取前 2 个元素,用一行代码 L[0:2] 就可以完成切片。L[0:2] 的意思是:从索引 0 开始取,直到索引 2 为止(不包括索引 2),即索引 0 和索引 1 正好是 2 个元素。

L = [1, "hello", "byebye", "birdpython"]
print(L[0:2])  # [1, "hello"]

我们也可以从索引的任意位置开始,向后取子集。

L = [1, "hello", "byebye", "birdpython"]
print(L[1:2])  # ["hello"]

如果我们所获取切片的第一个索引是 0,我们还可以简写成 L[:end]。比如我们从索引 0 取到索引 2(不包括 2)。

L = [1, "hello", "byebye", "birdpython"]
print(L[:2])  # [1, "hello"]

如果我们想从任意位置想取到最后一个值(包括最后一个值),可以用 L[begin:]。

L = [1, "hello", "byebye", "birdpython"]
print(L[1:])  # 从索引 1 开始到最后一个索引,结果为:["hello", "byebye", "birdpython"]
print(L[:])   # 从索引 0 开始到最后一个索引,结果为:[1, "hello", "byebye", "birdpython"]

Python 对有序集合支持负索引,索引为 -1 代表最后一个成员,-2 是倒数第二个成员,以此类推。

L = [1, "hello", "byebye"]
print(L[-1])
print(L[-2])
print(L[-3])

同样在我们也可以使用负索引进行切片,注意:使用负索引切片也是从左到右。

L = [1, "hello", "byebye"]
print(L[0:-1])    # [1, "hello"]
print(L[-3:2])    # [1, "hello"]
print(L[-3:-1])   # [1, "hello"]
print(L[0:2])     # [1, "hello"]

带步长的切片

假如有个 list 类型的变量 L,我们存储 20 个变量,变量值为 0-19。对于 L 中的前 10 个数,每隔 2 个数取 1 个值, 切片中第 2 个冒号后面的值代表每隔几个取 1 次值。

L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
print(L[0:11:2])

当步长为负数时,代表从右往左取值(我们也称为逆向切片),比如我们想输出一个有序集合的逆向,可以使用步长为负的切片。

L = [1, "hello", "byebye"]
print(L[len(L):-(len(L) + 1):-1])
print(L[-1::-1])
print(L[::-1])

关于切片的注意事项

如果我们通过切片取的范围不存在,则返回一个空的有序集合。

L = [1, "hello", "byebye"]
print(L[3:8])  # []
print(L[2:0])  # []

如果我们通过切片取得的索引最右边越界(步长为负是最左边),Python 解释器并不会抛出异常,而是取到最后一个成员且包含最后一个成员。

L = [1, "hello", "byebye"]
print(L[0:len(L)])  # [1, "hello", "byebye"]
print(L[0:8])       # [1, "hello", "byebye"]

对有序集合的切片操作并不会改变集合本身的值,Python 会另创建一个对象来存储切片后的子集。

L = [1, "hello", "byebye"]
newL = L[0:2]
print(L)
print(newL)

本节重要知识点

熟练使用切片。

对于没有步长或步长为正的切片,无论是正负索引,切片都是从左往右切。

记住步长为负时,切片从右往左切。

作业

对于以下代码,运行一下看下结果,想想为什么?

strone = "Hello"
strthree = "Hell"
strtwo = strone[:4]
strfour = strone[:]

print(strtwo)
print(strthree)
print(id(strtwo))
print(id(strthree))

print(strone)
print(strfour)
print(id(strone))
print(id(strfour))

print(id(strone[1]))
print(id(strtwo[1]))
print(id(strthree[1]))
print(id(strfour[1]))

如果以上内容对您有帮助,请老板用微信扫一下赞赏码,赞赏后加微信号 birdpython 领取免费视频。


登录后评论

user_image
大蚂蚁
2020年5月7日 07:46 回复

切片太方便了吧哈哈哈


user_image
咚巴拉小魔仙
2020年4月23日 04:30 回复

有个小疑问,比如s='ABCDE',为什么s[-1:]='E',而s[-1:-1]=[]?


user_image
老鸟python
2020年10月19日 00:54

第一个-1 表示的是ABCDE从E由-1往后,所以 -1 是最后一个元素 E

第二个[-1:-1[表示的是从-1开始到-1结束,遵循左闭右开原则,所以是[]


user_image
范德林德第一劳模
2019年7月26日 15:12 回复

很清楚哦,赞一个!


user_image
溏生蛋
2019年7月18日 15:50 回复

真的是很棒的总结了[赞同]


user_image
砍掉重练
2019年2月2日 13:19 回复

带步长的切片用的多吗?


user_image
黍离
2019年1月2日 16:56 回复

前两次输出都是:

helll

但前两次的地址不一样

后两次输出都是:

Hello

但后两次地址一样

最后四个输出都是常量字符串,地址都一样