写在前面
在向函数传递参数时,有时候会看到*args
和**kwargs
的字样,本文尝试理解个中含义。
使用args
将参数转换为元组形式保存到arg中
def foo(*args):
print(args)
if __name__ == '__main__':
foo(1,2)
output:
(1, 2)
使用kwargs
将参数转换为字典形式(必须指定参数进行传递)
def foo(**kwargs):
print(kwargs)
if __name__ == '__main__':
foo(a=1,b=2)
output:
{'a': 1, 'b': 2}
注意,这里在函数内部直接调用a或者b会报错,要用键值对的方式从kwargs中调用
二者同时使用
将未指定名称的参数转换为元组,将指定了名称的转换为字典
def foo(*args,**kwargs):
print(args)
print(kwargs)
if __name__ == '__main__':
foo(1,2,b=3,d=4)
output:
(1, 2)
{'b': 3, 'd': 4}
与普通参数混合
先按顺序接收指定的参数,剩余的参数交给args和kwargs
def foo(a,*args,**kwargs):
print(a)
print(args)
print(kwargs)
if __name__ == '__main__':
foo(1,2,b=3)
output:
1
(2,)
{'b': 3}
以下使用是不合法的,*args
之前的参数不应当使用参数名声明,之后的必须使用参数名声明
def foo(a,b,*args,**kwargs):
print(a)
print(b)
print(args)
print(kwargs)
if __name__ == '__main__':
foo(1,3,b=1)
另外,可以使用字典向函数传递参数:
def foo(*args,a,b,z=None,**kwargs):
print(a)
print(b)
print(z)
print(args)
print(kwargs)
if __name__ == '__main__':
my_foo = {'a':1,'b':2,'z':3,'d':4}
foo(**my_foo)
output:
1
2
3
()
{'d': 4}