2.5 序列解包
在实际开发中,序列解包是一个非常重要和常用的一个功能,可以使用非常简洁的形式完成复杂的功能,大幅度提高了代码的可读性,并且减少了程序员的代码输入量。例如,可以使用序列解包功能对多个变量同时进行赋值,下面都是合法的Python赋值方法。
1 >>> x,y,z = 1,2,3 #多个变量同时赋值
2 >>>
3 >>> v = (False,3.5,'exp')
4 >>>
5 >>> (x,y,z) = v
6 >>>
7 >>> x,y,z = v
8 >>>
9 >>> x,y,z = range(3) #可以使用range对象进行序列解包
10 >>>
11 >>> x,y,z = map(str,range(3)) #使用迭代对象进行序列解包
序列解包也可以使用列表和字典,但是对字典使用是,默认是对字典“键”进行操作,如果需要对“键:值”对进行操作,需要使用字典的item()方法说明,如果需要对字典“值”进行操作,则需要使用字典的values()方法明确指定。下面的代码演示了列表与字典的序列解包操作:
1 >>> a = [1,2,3]
2 >>> b,c,d = a #列表也支持序列解包的用法
3 >>> b
4 1
5 >>>
6 >>> x,y,z = sorted([1,3,2]) #sorted()函数返回排序后的列表
7 >>>
8 >>> s = {'a':1,'b':2,'c':3}
9 >>>
10 >>> b,c,d = s.items()
11 >>>
12 >>> b #这里的结果如果和你的不一样是正常的,因为字典是无序序列
13 ('a', 1)
14 >>>
15 >>> b,c,d = s #使用字典就不要考虑元素的顺序问题了
16 >>>
17 >>> b
18 'a'
19 >>>
20 >>> b,c,d = s.values()
21 >>>
22 >>> b
23 1
24 >>>
25 >>> print(b,c,d)
26 1 2 3
27 >>>
使用序列解包可以很方便地同时遍历多个序列。
1 >>> keys = ['a','b','c','d']
2 >>>
3 >>> values = [1,2,3,4]
4 >>>
5 >>> for k,v in zip(keys,values):
6 print(k,v)
7
8
9 a 1
10 b 2
11 c 3
12 d 4
13 >>>
14 >>>
15 >>> #下面代码演示了对内置函数enumerate()返回的迭代对象进行遍历时序列解包的用法:
16 >>>
17 >>> x = ['a','b','c']
18 >>>
19 >>> for i,v enumerate(x):
20
21 SyntaxError: invalid syntax
22 >>>
23 >>> for i,v in enumerate(x):
24 print('The value on position {0} is {1}'.format(i,v))
25
26
27 The value on position 0 is a
28 The value on position 1 is b
29 The value on position 2 is c
30 >>>
31 >>>
32 >>>
33 >>> #下面对字典的操作也使用到序列解包:
34 >>> s = {'a':1,'b':2,'c':3}
35 >>>
36 >>> for k,v in s.items(): #字典的每个元素都包含“键”和“值”两部分
37 print(k,v)
38
39
40 a 1
41 b 2
42 c 3
43 >>>
44 >>>
45 >>> #另外,序列解包还支持下面的用法:
46 >>>
47 >>> print(*[1,2,3],4,*(5,6))
48 1 2 3 4 5 6
49 >>>
50 >>> * range(4),4
51 (0, 1, 2, 3, 4)
52 >>>
53 >>>
54 >>> * range(4),
55 (0, 1, 2, 3)
56 >>>
57 >>> { * range(4),4, * (5,6,7)}
58 {0, 1, 2, 3, 4, 5, 6, 7}
59 >>>
60 >>> {'x':1,**{'y':2}}
61 {'x': 1, 'y': 2}
62 >>>
小提示:
(1)序列解包的有些用法在低版本Python中不支持;
(2)在调用函数时,在实参前面加上一个星号(*)也可以进行序列解包,从而实现将序列中的元素值依次传递给相同数量的形参,详见3.3节。