DAY 8. *args和**kwargs
*args
:多值元組,**kwargs
多值字典,他們是python函數傳參時兩個特殊的參數,args和kwargs并不是強制的,但習慣使用這兩個,如果在函數參數列表中聲明了*args
,則允許傳遞任意多的參數,多余的參數會被以元組的形式賦給args變量,而**kwargs
允許你使用沒有定義的變量名,會把顯式傳遞的參數打包成字典
def output(*args, **kwargs):print(args)print(kwargs)output('zhangsan', 'lisi', 5, 6,a=1,b=2,c=3)# ('zhangsan', 'lisi', 5, 6)
# {'a': 1, 'b': 2, 'c': 3}
如果函數還有別的參數,傳遞參數時會從左到右依次對照賦值,所以請務必把*args
和**kwargs
放在函數參數列表的最后,否則會拋出TypeError異常,并且*args
必須放在**kwargs
前面,正確的參數順序應該是
def fun(arg, *args, **kwargs):pass
在調用函數時也可以使用*
和**
def put(a, b, c):print(f'a={a},b={b},c={c}')put(*mylist) # a=aardvark,b=baboon,c=cats = {'a': 1, 'b': 2, 'c': 3}
put(**s) # a=1,b=2,c=3
之所以能實現這樣的功能,原理是序列解包,下面簡單介紹序列解包
>>> s = "ABCDE"
>>> a,b,c,d,e = s
>>> a,c
('A', 'C')>>> t = (1,2,3,4,5)
>>> a1,b1,c1,d1,e1 = t
>>> a1,c1
(1, 3)
上面就是用到了序列解包,左右兩端的元素個數必須相等,否則會拋出ValueError異常
>>> a2,b2 = s
Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>a2,b2 = s
ValueError: too many values to unpack (expected 2)
但總不能所有序列都一一對應把,如果序列有很多位或不確定有多少位時使用序列解包就顯得很不方便了,這時候就可以使用*
和了
>>> a3,*a4 = s
>>> a3,a4
('A', ['B', 'C', 'D', 'E'])
>>> while s:f,*s = sprint(f,s)A ['B', 'C', 'D', 'E']
B ['C', 'D', 'E']
C ['D', 'E']
D ['E']
E []
參考文章:
詳解Python序列解包(4)
stack overflow
從一個例子看Python3.x中序列解包
GitHub python面試題