前言
经常看开源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不能包含无关参数,否则会报错