在python的学习中,切片使用的地方非常多,因为字符串、列表、元组都符合"序列"这一特征,只要符合这个特征都可以使用切片去访问它们任意部分,下面我们进入切片的学习。

切片的三个参数:[start:stop:step]

start(开始索引):从0开始(端点处),当step是正数时,从左向右开始计数,最后一个索引可以用-1表示,当step是负数时,从右往左计数。

stop(终止索引):切片操作结束的位置,不包含该参数的值,当参数省略时,表示取到数据"端点",方向由step的值决定,当step>0时,为终点,当step<0时,为起点。

step(步长):步长表示切片的间隔,步长默认值是1,当步长为负数时,则表示从右往左开始计数,但步长的值不能是0.

注意:切片的方向非常重要(分清楚到底是从左往右,还是从右往左)

1.正常切取

>>> s = [1,3,4,5,7,8,9]
>>> s[0:4:2]             #从左往右,步长为2
[1, 4]
>>> s[::-1]              #从右往左,步长为1
[9, 8, 7, 5, 4, 3, 1]
>>> s[2:4:]
[4, 5]
>>> s[:6:]
[1, 3, 4, 5, 7, 8]

2.插入和修改元素

>>> s = [1,3,5,7,9]
>>> s[0:0] = [0]        #插入到下标为0,长度为0的位置
>>> s
[0, 1, 3, 5, 7, 9]
>>> s[2:3] = [2]        #插入到下标为2,长度为3的位置
>>> s
[0, 1, 2, 3, 5, 7, 9]   
>>> s[5:6] = [6]        #插入到下标为5,长度为6的位置
>>> s
[0, 1, 2, 3, 5, 6, 7, 9]
>>> s[7] = 8            #将下标为7的元素修改为8
>>> s
[0, 1, 2, 3, 5, 6, 7, 8]

3.删除元素

>>> s = [1,2,3,4,6,8]
>>> del s[0:1]          #删掉下标为0,长度为1的元素
>>> s
[2, 3, 4, 6, 8]
>>> del s[1:2]          #删掉下标为1,长度为2的元素
>>> s
[2, 4, 6, 8]

4.切取单个值

>>> s = [1,3,5,7,9]
>>> s[2]
5
>>> s[-2]
7

5.切取完整对象

>>> s = [1,2,3,4,5,6,7]
>>> s[:]                #从左往右
[1, 2, 3, 4, 5, 6, 7]
>>> s[:-1]
[1, 2, 3, 4, 5, 6]
>>> s[::-1]             #从右往左
[7, 6, 5, 4, 3, 2, 1]
>>>

6.混合索引情况

>>> s = [1,2,3,4,5,6,7,8]
>>> s[:-4:]              #[1,5],从左往右
[1, 2, 3, 4]
>>> s[-1:-6:]            #[8,7,6,5,4],但却是从左往右数,所以是空的
[]
>>> s[-1:-6:-1]          #[8,7,6,5,4],从右往左数
[8, 7, 6, 5, 4]
>>> s[2:6:-1]            #[2,3,4,5],从右往左数,所以是空的
[]
>>>

7.连续切片

>>> s = [1,2,3,4,5,6,7,8,9]
>>> s[:8][2:5][-1:]
[5]
>>>

#1.[1,2,3,4,5,6,7]
#2.[3,4,5]
#3.[5]

8.参数可以使用表达式

>>> s = [1,2,3,4,5,6,7]
>>> s[2+1:3*2:7%2]         #表示为s[3:6:1]
[4, 5, 6]
>>>

9.取偶数位置

>>> s = [1,2,3,4,5,6,7,8,9]
>>> s[::2]
[1, 3, 5, 7, 9]
>>>

10.取奇数位置

>>> s = [1,2,3,4,5,6,7,8,9]
>>> s[::2]
[1, 3, 5, 7, 9]
>>> s[1::2]
[2, 4, 6, 8]
>>>

注意事项:

start、stop、step可同时为正、同时为负,也可以混合使用。但必须遵循的原则,否则无法正确切取到数据。

1.当start在stop左边时,表示从左往右取值,这里的step必须为正数(同时表示从左往右)。

2.当start在stop右边时,表示从右往左取值,这里的step必须为负数(同时表示从右往左)。

3.当start和stop都省略时,取值方向由step的正负决定,不会出现取值方向的矛盾。