python进阶——高级特性(一)切片
本文最后更新于:1 年前
¶(一)概述
在编程过程中,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)举例:
-
切单一值:
1
2
3
4
5
6
7
8a = [0,1,2,3,4,5,6,7,8,9]
print(a[0])
print(a[9])
print(a[5])
# 运行结果:
# 0
# 9
# 5 -
切完整对象:
1
2
3
4
5
6
7
8
9
10a = [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:
1
2
3
4
5
6
7
8
9
10
11# 运行结果:
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:
1
2
3
4
5
6
7
8
9
10
11# 运行结果:
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:
1
2
3
4
5
6
7
8
9
10a = [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:
1
2
3
4
5
6
7
8
9
10
11# 运行结果:
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:
1
2
3
4
5
6
7
8
9
10a = [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:
1
2
3
4
5
6
7
8
9
10a = [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:
1
2
3
4
5
6
7
8
9
10a = [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:
1
2
3
4
5
6
7
8
9
10a = [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] -
缺省:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33a = [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]切片除了用于列表,还可以用于其他序列对象,此处不再举例。