前言
經常看開源python代碼,對於*和**的用法理解不透徹,決定弄懂。
涵義
可變參數
常見於python主函數的一種寫法
def foo(*args, **kwargs):
pass
有點類似於C++的通配參數
*args
用於捕獲所有的順序參數,返回tuple
**kwargs
用於捕獲所有的關鍵字參數,返回dict
舉例說明
>>> def foo(*args,**kwargs):
... print("args=",args)
... print("kwargs=",kwargs)
...
>>> foo(1)
args= (1,)
kwargs= {}
>>> foo(1,2,3)
args= (1, 2, 3)
kwargs= {}
>>> foo(1,2,x=3)
args= (1, 2)
kwargs= {'x': 3}
>>> foo(1,2,3,c=4,5)
File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
為避免歧義python規定關鍵字參數只能放在最后
字典提取
對於dict對象,*和**可以用來提取內容
>>> d={'x':1,'y':2,'z':3}
>>> print(*d)
x y z
等效於print('x','y','z')
>>> d={'x':1,'y':2,'z':3}
>>> def bar(x,y,z):
... return x+y+z
...
>>> bar(**d)
6
等效於bar(x=1,y=2,z=3)
>>> d={'x':1,'y':2,'z':3}
>>> def plus(x,y):
... return x+y
...
>>> plus(**d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: plus() got an unexpected keyword argument 'z'
注意dict不能包含無關參數,否則會報錯