首先说明,args和kwargs只是约定俗成,这两个东西可以用任何合法的名称代替,比如*dogs,**cats,结果一至,起作用的是 * 和 * *
-
*args
*args用于接收多个参数,跟位置有关。接收到的所有参数组成一个元组。例:def f(*value): for i in value: print(i) print(value) print(type(value)) # 看一下value的类型 f(1, 2, 1)
输出为:
>>> 1
>>> 2
>>> 1
>>> (1, 2, 1)
>>> <class 'tuple'>
-
**kwargs:
**kwargs用于接收任意个参数,但接收方式为键值对:key=value,接收到的所有key和value组成一个字典。例:def f(**value): for i in value: print(i) print(value) # 看一下value的内容 print(type(value)) # 看一下value的类型 f(a = 1, b = 2)
输出结果为:
>>> a
>>> b
>>> {'a': 1, 'b': 2}
>>> <class 'dict'>
既然value是一个字典,当然可以用items()方法。for i, j in value.items(): print(i, j)
结果为:
>>> a 1
>>> b 2
-
*args 与 ** kwargs组合使用,注意一点,就是必须严格按照格式传参,比如:
def f(*args, **kwargs): print(args) print(kwargs) f('c', 3, 'rw', 'mame', age=19, a=1, b=2)
输出结果为:
>>> ('c', 3, 'rw', 'mame')
>>> {'age': 19, 'a': 1, 'b': 2}
可以看出,*args将位置参数构造成一个元组,而**kwargs将关键字参数构成一个字典。下面是错误的传参:f('c', 3, 'rw', 'mame', age=19, a=1, b=2, 'sda')