*args表示可以传入任意数量的“值变量”,**kwargs表示可以传入任意数量的键值变量。
*args必须写在**kwargs前面。
函数定义时,*和**表示打包。即*把传入的一系列“值变量”打包成一个 tuple 元组,存入变量 args;**把传入的一系列键值变量打包成一个字典,存入变量 kwargs。
函数调用时,*和**表示解包。即*把一个 tuple 或 list 等打散成一个个元素;**表示把一个字典打散成一个个键值。
举个例子:
def func(*args, **kwargs):
print(args)
print(kwargs)
apple = [*args] # list:['aaa', (1, 2, 3), 4, 5, 6]
banana = [*kwargs] # list:['x', 'y', 'a', 'b']
print(apple)
print(banana)
a = (1, 2, 3)
b = (4, 5, 6)
d = {'a': 11, 'b': 22}
func("aaa", a, *b, x=111, y="bbb", **d)
# 输出
('aaa', (1, 2, 3), 4, 5, 6)
{'x': 111, 'y': 'bbb', 'a': 11, 'b': 22}
aaa (1, 2, 3) 4 5 6
x y a b
func("aaa", a, *b, x=111, y="bbb", **d)
首先 *b 和 **d 对 b 和 d 解包,打散成元素和键值;
然后将 "aaa", a, *b 打包作为 args,x=111, y="bbb", **d 打包作为 kwargs,args 和 kwargs 分别为元组和字典;
函数内的解包 *args,将元组 args 解包成一个个元素;*kwargs 将字典按照元组的形式解包,打散成key。**解包字典好像不能脱离函数,暂时无法独立使用(挠头
解包字典
(1)直接获取values:
d = {'a': 11, 'b': 22}
a, b = d.values() # int:11 int:22
dv = d.values() # dict_values:([11, 22])
(2)直接获取keys:
d = {'a': 11, 'b': 22}
a, b = d.keys() # str:'a' str:'b'
dk = d.keys() # dict_keys:(['a', 'b'])
(3)**解包输出values:
print可以传入*args参数,但无法传入**kwargs,需要使用.format()
d = {'a': 11, 'b': 22}
print("{a} {b}".format(**d))
# 输出
11 22
(4)*解包输出keys:
上面提到的,用*解包得到的就是keys
d = {'a': 11, 'b': 22}
print(*d)
#输出
a b