在实际开发中,序列解包是一个非常重要和常用的一个功能,可以使用非常简洁的形式完成复杂的功能,大幅度提高了代码的可读性,并且减少了程序员的代码输入量。例如,可以使用序列解包功能对多个变量同时进行赋值,下面都是合法的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节。