*args和**kwargs常用来函数的参数传递上:
def f(x, *args, **kwargs):
print(type(x), x)
print(type(args), args)
print(type(kwargs), kwargs)
f(1,2,3, a=1, b=2)
输出:
<class 'int'> 1
<class 'tuple'> (2, 3)
<class 'dict'> {'a': 1, 'b': 2}
x为自定义的变量值,接收第一个值,args接收剩余的值并通过*汇聚成一个tuple;kwargs接收剩余的键值对并通过 ** 汇聚成一个字典。上述的3部分顺序是不能颠倒的,前两部分称为位置参数,最后一部分属于关键字参数。
在函数定义时,*和**的作用是汇聚参数为tuple和dict,但是在参数传递的时候相当于分解参数。
*list,tuple:可以将列表,元组拆分为多个元素
**dict:可以将字典分解为独立的元素。此时键值为变量名,对应的值就是变量的值。
def add(a, b):
return a - b
data = [4, 3]
print(add(*data)) # 1, 等价于add(4,3)
print(*data) # 4 3
data = {'a': 4, 'b': 3}
print(add(**data)) # 1,等价于add(a=4, b=3)
data = {'a': 3, 'b': 4}
print(add(**data)) # -1,等价于add(a=3,b=4)
print(**data) # 无法直接输出
可以通过使用**灵活地汇聚参数和分解参数:
def add(a, b):
return a+b
def f(x, **kwargs):
print(x)
print(kwargs) # {'a': 1, 'b': 2}
print(add(**kwargs)) # add(a=1, b=2)
f(1, a=1, b=2)