1、任何可迭代对象都支持解包,可迭代对象包括元组、字典、集合、字符串、生成器等实现了next方法的一切对象
2、python3中,支持更高级的解包操作,用星号操作使得等号左边的变量个数可以少于右边迭代对象中元素的个数
3、函数调用时,可以用 * 或者 ** 解包可迭代对象,作为参数传递
对可迭代对象解包,赋值方式
>>> a,b,c=['a',[1,2,3],'c'] #列表解包
>>> a
'a'
>>> b
[1, 2, 3]
>>> c
'c'
>>> a,b,c=('a',[1,2,3],'c') #元组解包
>>> a
'a'
>>> b
[1, 2, 3]
>>> c
'c'
#字符串、range() 、enumerate()、zip()类似
对字典解包,解出的是KEY,或者使用dict的内置方法
>>> print(*{1:'a',2:'b',3:'c'})
1 2 3
>>> dict1={1:'a',2:'b',3:'c'}
>>> a,b,c=dict1.keys()
>>> a
1
>>> b
2
>>> c
3
>>> a,b,c=dict1.items()
>>> a
(1, 'a')
>>> b
(2, 'b')
>>> c
(3, 'c')
用于列表拼接,并不是所有的列表可以用‘+’拼接的,这时候使用解包就很方便
>>> list1=[1,2,3]
>>> list2=range(4,6)
>>> list1+list2 #range()的列表不能使用‘+’拼接
Traceback (most recent call last):
File "<pyshell#53>", line 1, in <module>
list1+list2
TypeError: can only concatenate list (not "range") to list
>>> [*list1,*list2]
[1, 2, 3, 4, 5]
注意,使用解包赋值两边的值要相等,不等会报错
>>> a,b=[1,2,3]
Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
a,b=[1,2,3]
ValueError: too many values to unpack (expected 2)
>>> a,b,c,d=[1,2,3]
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
a,b,c,d=[1,2,3]
ValueError: not enough values to unpack (expected 4, got 3)
新版本的python对解包方式有了更好的处理,与函数传参数一样,收集参数方式:传入列表
>>> a,*b=[1,2,3] #第一个给a,剩余的收集给b
>>> a
1
>>> b
[2, 3]
>>> *a,*b=[1,2,3] #无法确认赋值方式
SyntaxError: two starred expressions in assignment
>>> a,*b,c=[1,2,3,4] #第一个给a,最后一个给c,剩余的收集给b
>>> a
1
>>> b
[2, 3]
>>> c
4
>>> a,*b,c,d=[1,2,3,4]
>>> b
[2]
在函数使用中,我们经常看到参数args,*key