Python - 对切片的理解

由 叶清风 发布

定义

在 Python 中,切片是对序列型对象的一种高级索引方法。普通索引只去除序列中一个下标对应的元素,而切片取出一个范围对应的元素,这里的范围不是狭义上的连续片段。

基本索引

基本索引是指对单个元素的索引。

  • 基本索引有负数下标和非负数下标;
  • 非负数下标从零开始,从序列型对象的第一个数开始计数;
  • 负数下标从负一开始,从序列型对象的最后一个数开始计数;
  • 负数下标和非负数下标共同构成了 Python 索引的有效范围;
  • 在基本索引中,如果使用了超出有效范围的值作为索引,就会引发 IndexError 异常。
    但是,在切片中,由于切片的一些特性,如果使用了超出了有效范围的值作为索引,并不会引发 IndexError 异常。下文将说明原因。

简单切片

简单切片的形式是:a[Start:stop]
使用简单切片的目的是在序列型对象中截取一段连续的值,这些值从 a[Start] 开始,在到达 a[Stop] 时结束,并且不录入 a[Stop]
举个例子:

a = [1, 2, 3, 4, 5, 6]
print(a[2:4])

# 结果
[3, 4]

在这个例子中,Start 是 2,Stop 是 4,程序从零开始读取索引,到索引的值为 2 的时候,录入了 3,在索引的值为 3 的时候,录入了 4,在索引的值为 4 的时候,读取停止。

当使用的值超出索引的有效范围

当使用的 StartStop 参数的值超出索引的有效范围,切片操作并不会抛出异常,而是对超出索引的有效范围的部分切片进行截断(即取交集。)。
例:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(0:100)

# 结果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

缺省

StartStop 都是可以缺省的。在两者有一者或者两者缺省的情况下,Python 会尽可能取最大区间。需要注意的是,Python 所认为的取最大区间,是针对 StartStop 分别判断的。

拓展切片

拓展切片的形式:a[Start:Stop:Step]

  • Step 是非零整数;
  • Step 的作用是调整步长。

    • 添加了 Step 之后,切片的行为:从 Start 开始,以 Step 为步长索引序列,直到读取到或者超过 Stop 的值,切片中不包含 Stop 本身。

Step 为正数时

缺省Start 的缺省值为无穷小,Stop 的缺省值为无穷大。
截断:仍然是取交集。
例:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[0:5:2])

# 结果
[0, 2, 4]

b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(b[:5:2])

# 结果
[0, 2, 4]

c = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(c[5::2])

# 结果
[5, 7, 9]

d = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(d[::2])

# 结果
[0, 2, 4, 6, 8]

Step为负数时

缺省Start 的缺省值为无穷大,Stop 的缺省值为无穷小。
截断:仍然是取交集。
例:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[0:5:-2])

# 结果
[]

b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(b[:5:-2])

# 结果
[9, 7]

c = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(c[5::-2])

# 结果
[5, 3, 1]

d = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(d[::-2])

# 结果
[9, 7, 5, 3, 1]

练习题 / 实例

# 切片。
str = "The first three items in the list are:"
print(str)
li = list(str) # 直接使用 list 函数可以直接将其他类型的变量转换为列表。
print(li[:3])

str1 = "Three items from the middle of the list are:"
print(str1)
li1 = list(str1)
print(li1[5:8]) # 列表切片种的第二个参数所对应的索引是不包含在切片内的。

str2 = "The last three items in the list are:"
print(str2)
li2 = list(str2)
print(li2[-3:])

# 用 for 来打印列表中的值。
my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]
print("My favorite foods are:")
for my in my_foods:
    print(my)
print("\nMy friend's favorite foods are:")
for fri in friend_foods:
    print(fri)

总结

  1. Python 切片的完整语法为:a[Start:Stop:Step]
  2. Python 切片不会因为参数超出索引范围而报错,而是会选择取参数繁育与索引范围的交集;
  3. Step 可以为负数。

暂无评论

发表评论