1、任何可迭代對象都支持解包,可迭代對象包括元組、字典、集合、字符串、生成器等實現(xiàn)了next方法的一切對象
2、python3中,支持更高級的解包操作,用星號操作使得等號左邊的變量個數(shù)可以少于右邊迭代對象中元素的個數(shù)
3、函數(shù)調(diào)用時,可以用 * 或者 ** 解包可迭代對象,作為參數(shù)傳遞
對可迭代對象解包,賦值方式
>>> 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的內(nèi)置方法
>>> 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對解包方式有了更好的處理,與函數(shù)傳參數(shù)一樣,收集參數(shù)方式:傳入列表
>>> a,*b=[1,2,3] #第一個給a,剩余的收集給b
>>> a
1
>>> b
[2, 3]
>>> *a,*b=[1,2,3] #無法確認(rèn)賦值方式
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]
在函數(shù)使用中,我們經(jīng)??吹絽?shù)args,*key