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节。

原文地址:https://www.cnblogs.com/avention/p/8552583.html