如有兴趣了解更多请关注我的个人博客https://07xiaohei.com/
(一)概述
在编程过程中,Python提供了很多高级特性,用于精简代码,提高运行速度或者节省空间。
该系列将会介绍切片,迭代,迭代器,列表生成式和生成器。
装饰器实际上也算是高级特性的一部分,但为了文章的连贯,写在了python基础——函数(三)中,如希望更多了解装饰器,请移步此博客。
(二)切片
1. 概述:
Python中对序列性对象的一种高级索引方法,可以取出序列中的一个范围对应的元素,且范围不一定连续,长度和频率不一定固定。
切片不会改变原值,返回的结果类型和切片对象的类型是一致的,可以理解为其返回的是切片对象的子序列——字符串切片返回字符串,列表切片返回列表。
切片实际上是一种浅拷贝,其生成的子序列是对原版的拷贝。
2. 基本索引:
Python中的序列性对象有两种索引方式——正索引和负索引。
以索引序列list_use为例,index为索引下标,list_use[index]表示对应元素,我们有:
list_use元素 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
正索引index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
负索引index | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
正索引从0开始,0对应首元素;负索引从-1开始,-1对应末元素。
正负索引共同构成了Python索引的有效范围,基本索引中如果索引超出了有效范围会报错。
3. 切片操作:
(1)语法格式:
object[start_index : end_index : step]
完整的切片表达式如上,会包括三个参数,参数之间用":"分割。
-
step:先介绍step是为了理解后面两个索引的缺省情况。
step是指切片的步长,可正可负,绝对值代表步长大小,正负性代表了步长的方向——正步长表示从左向右取值,负步长表示从右往左取值。
step可以缺省,默认值为1,表示逐个元素取值,不会跳过任何一个元素。
-
start_index:表示起始索引,起始索引被包括到了切片子序列中。
起始索引可以缺省,表示从被切片对象的某一端开始,如果步长为正,表示从最左端开始,如果为负,则从最右端开始。
-
end_index:表示终止索引,终止索引不会包括到切片子序列中。
终止索引可以缺省,表示从被切片对象的某一端开始,如果步长为正,表示从最右端开始,如果为负,则从最左端开始。
截断:在切片中,start_index和end_index允许绝对值大于被切片序列的长度,也就是超过索引的有效范围。此时不会发生报错,而是发生截断——所有的超出部分被自动忽略,只选取有效部分进行切片。
三个参数的组合必须正确:当start_index对应位置在end_index对应位置左侧时step应>0;当start_index对应位置在end_index对应位置右侧时step应<0,使用正索引还是负索引均可以,是否存在截断均可以,但必须符合上面的要求。
(2)举例:
-
切单一值:
a = [0,1,2,3,4,5,6,7,8,9] print(a[0]) print(a[9]) print(a[5]) # 运行结果: # 0 # 9 # 5
-
切完整对象:
a = [0,1,2,3,4,5,6,7,8,9] print(a[0:10]) print(a[:]) print(a[0:]) print(a[-1::-1]) # 运行结果: # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
-
start_index>0,end_index>0,step>0:
# 运行结果: a = [0,1,2,3,4,5,6,7,8,9] print(a[2:7:1]) print(a[2:8:2]) print(a[1:19:3]) print(a[5:233]) # 运行结果: # [2, 3, 4, 5, 6] # [2, 4, 6] # [1, 4, 7] # [5, 6, 7, 8, 9]
-
start_index>0,end_index>0,step<0:
# 运行结果: a = [0,1,2,3,4,5,6,7,8,9] print(a[7:2:-1]) print(a[8:2:-2]) print(a[19:1:-3]) print(a[233:5:-1]) # 运行结果: # [7, 6, 5, 4, 3] # [8, 6, 4] # [9, 6, 3] # [9, 8, 7, 6]
-
start_index<0,end_index<0,step>0:
a = [0,1,2,3,4,5,6,7,8,9] print(a[-7:-2:1]) print(a[-8:-2:2]) print(a[-19:-1:3]) print(a[-233:-5:1]) # 运行结果: # [3, 4, 5, 6, 7] # [2, 4, 6] # [0, 3, 6] # [0, 1, 2, 3, 4]
-
start_index<0,end_index<0,step<0:
# 运行结果: a = [0,1,2,3,4,5,6,7,8,9] print(a[-2:-7:-1]) print(a[-2:-8:-2]) print(a[-1:-19:-3]) print(a[-5:-233:-1]) # 运行结果: # [8, 7, 6, 5, 4] # [8, 6, 4] # [9, 6, 3, 0] # [5, 4, 3, 2, 1, 0]
-
start_index>0,end_index<0,step>0:
a = [0,1,2,3,4,5,6,7,8,9] print(a[2:-2:1]) print(a[4:-1:2]) print(a[3:-3:3]) print(a[0:-5:1]) # 运行结果: # [2, 3, 4, 5, 6, 7] # [4, 6, 8] # [3, 6] # [0, 1, 2, 3, 4]
-
start_index>0,end_index<0,step<0:
a = [0,1,2,3,4,5,6,7,8,9] print(a[8:-8:-1]) print(a[6:-9:-2]) print(a[123:-7:-3]) print(a[6:-15:-1]) # 运行结果: # [8, 7, 6, 5, 4, 3] # [6, 4, 2] # [9, 6] # [6, 5, 4, 3, 2, 1, 0]
-
start_index<0,end_index>0,step>0:
a = [0,1,2,3,4,5,6,7,8,9] print(a[-2:2:-1]) print(a[-4:1:-2]) print(a[-3:3:-3]) print(a[-1:5:-1]) # 运行结果: # [8, 7, 6, 5, 4, 3] # [6, 4, 2] # [7, 4] # [9, 8, 7, 6]
-
start_index<0,end_index>0,step<0:
a = [0,1,2,3,4,5,6,7,8,9] print(a[-8:8:1]) print(a[-6:9:2]) print(a[-7:7:3]) print(a[-9:5:1]) # 运行结果: # [2, 3, 4, 5, 6, 7] # [4, 6, 8] # [3, 6] # [1, 2, 3, 4]
-
缺省:
a = [0,1,2,3,4,5,6,7,8,9] print(a[::]) print(a[5::]) print(a[-5::]) print(a[:4:]) print(a[:-6:]) print(a[::2]) print(a[::-2]) print(a[3::2]) print(a[-7::1]) print(a[7::-2]) print(a[-3::-1]) print(a[:7:2]) print(a[:-3:1]) print(a[:-7:-2]) print(a[:3:-1]) # 运行结果: # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # [5, 6, 7, 8, 9] # [5, 6, 7, 8, 9] # [0, 1, 2, 3] # [0, 1, 2, 3] # [0, 2, 4, 6, 8] # [9, 7, 5, 3, 1] # [3, 5, 7, 9] # [3, 4, 5, 6, 7, 8, 9] # [7, 5, 3, 1] # [7, 6, 5, 4, 3, 2, 1, 0] # [0, 2, 4, 6] # [0, 1, 2, 3, 4, 5, 6] # [9, 7, 5] # [9, 8, 7, 6, 5, 4]
切片除了用于列表,还可以用于其他序列对象,此处不再举例。