*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+bdef power(x):return x**2calc(add, 2, 3)
calc(power, 2)
#输出5 4