*args和**kwargs的区别
首先*args和**kwargs的区别主要是*和**的区别,与变量名args和kwargs无关,也可以命名成*cat和**dog;*args接收不带变量名的变量,**kwargs接收带变量名的变量。*args和**kwargs可以共同使用,但是顺序一定是先*args,再**kwargs
*args
*args接收多余的不带变量名的变量,如图中的3,4,5,6,7,并保存为tuple,就可以用遍历和索引方式访问args,比如这里将args[0]赋给变量key_size
def f(x, y, *args):
print("x = ", x)
print("y = ", y)
print("args = ", args)
print(type(args))
key_size = args[0]
print("key_size = ", key_size)
f(1, 2, 3, 4, 5, 6, 7)
**kwargs
**kwargs接收多余的带变量名的变量,并保存为dict
def f(x, y, **kwargs):
print("x = ", x)
print("y = ", y)
print("kwargs = ", kwargs)
print(type(kwargs))
for k in kwargs:
print(k, kwargs[k])
e = kwargs['e']
print("")
print("e:", e)
fun(1, 2, c=3, d=4, e=5, f=6, g=7)
关于*args和**kwargs的作用
-
别人可能会传一些多余的参数进来,如果你函数里没有做相应的接收,程序就会报错,加了**kwargs或者*args可以把这些参数忽略掉,避免程序报错
-
可以让你的参数长度是可变的,比如nn.sequential,pytorch不知道你需要叠加多少层,就让你先把要堆叠的层先传进去,后续可以自由在nn.sequential中增加层数,然后再遍历你传进来的参数
-
考虑的是函数的复用,比如一个计算器函数,事先并不知道用户实际会进行什么运算,不同的计算传递的参数也会不一样,这时候就要用到*args,如以下代码
-
用在装饰器中
def calc(f, *args):
print(f(*args))
def add(a, b):
return a+b
def power(x):
return x**2
calc(add, 2, 3)
calc(power, 2)
#输出5 4