Python中的序列步长(第3节)


当我们想要从序列中获取一些元素时,可以使用序列切片来进行操作。在大多数的情况下,我们会选择一系列连续的元素。那么在不连续元素的选择上,我们应该怎么办呢?为了满足这种情况,Python提供了第三个参数步长步长是指在序列切片的过程中,每隔多少个元素取一次。默认情况下步长为“1”,就是按照一个元素一个元素地取;如果步长为2,就是从开始到结束每隔一个元素地取,以此类推,例如:

动手练一练:

# 列表
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print('列表')
print(a[1:4]) # 输出[2, 3, 4]
print(a[1:4:1]) # 输出[2, 3, 4]
print(a[1:4:2]) # 输出[2, 4]
print(a[1::3]) # 第二个参数为空,则默认到最后一个元素,输出[2, 5, 8]

print('------这是虚线------')

# 元组
b = (1, 2, 3, 4, 5, 6, 7, 8, 9)
print('元组')
print(b[1:4]) # 输出(2, 3, 4)
print(b[1:4:1]) # 输出(2, 3, 4)
print(b[1:4:2]) # 输出(2, 4)
print(b[1::3]) # 第二个参数为空,则默认到最后一个元素,输出(2, 5, 8)

print('------这还是虚线------')

# 字符串
c = "123456789"
print('字符串')
print(c[1:4]) # 输出234
print(c[1:4:1]) # 输出234
print(c[1:4:2]) # 输出24
print(c[1::3]) # 第二个参数为空,则默认到最后一个元素,输出258

执行以上代码,输出结果为:

列表
[2, 3, 4]
[2, 3, 4]
[2, 4]
[2, 5, 8]
------这是虚线------
元组
(2, 3, 4)
(2, 3, 4)
(2, 4)
(2, 5, 8)
------这还是虚线------
字符串
234
234
24
258

步长切片是Python中非常常用的操作方法之一,用步长的方式是很灵活的,只需在切片后再添加“:”并输人想要的步长即可。不过需要注意的是,步长不能为“0”,如果步长为“0”,Python解释器会输出“切片步长不能为零”的错误信息,但步长可以是负数,即从右到左提取元素,但开始索引必须大于结束索引,例如:

动手练一练:

# 列表
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print('列表')
print(a[1:4:0]) # 提示错误

print('------这是虚线------')

# 元组
b = (1, 2, 3, 4, 5, 6, 7, 8, 9)
print('元组')
print(b[1:4:0]) # 提示错误

print('------这还是虚线------')

# 字符串
c = "123456789"
print('字符串')
print(c[1:4:0]) # 提示错误

执行以上代码,输出结果为:

ValueError: slice step cannot be zero

动手练一练:

# 列表
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print('列表')
print(a[4::-1]) # 输出[5, 4, 3, 2, 1]
print(a[4::-2]) # 输出[5, 3, 1]

print('------这是虚线------')

# 元组
b = (1, 2, 3, 4, 5, 6, 7, 8, 9)
print('元组')
print(b[4::-1]) # 输出(5, 4, 3, 2, 1)
print(b[4::-2]) # 输出(5, 3, 1)

print('------这还是虚线------')

# 字符串
c = "123456789"
print('字符串')
print(c[4::-1]) # 输出54321
print(c[4::-2]) # 输出531

执行以上代码,输出结果为:

列表
[5, 4, 3, 2, 1]
[5, 3, 1]
------这是虚线------
元组
(5, 4, 3, 2, 1)
(5, 3, 1)
------这还是虚线------
字符串
54321
531

上面的例子中,在步长为负数的情况下,Python会从序列的尾部开始向左获取元素,直到第一个元素为止。正数的步长则是从序列的起始位置开始从左往右获取元索,负数的步长则正好相反。所以正数的步长开始索引必须小于结束索引,而负数的步长开始索引必须大于结束索引。