python的*args和**kwargs
一.*args
*args有两部分构成即 * 和 args ,其中∗ 打包(pack)的作用是把多位置参数打包成元组;拆分参数(unpack)是把打包的参数拆成单个的,然后依次传递给函数的形参。
*args的pack可以把多个位置的参数打包成一个元组,它一般有两种格式:get_case(*args)或get_case(a,b,*args)
1.get_case(*args)格式:
例如:
def get_case(*args):
for casename in args:
print(casename)
print("args的种类:",type(args))
print("args的内容:",args)
get_case("a","b","c","d",3)
输出效果:
a
b
c
d
3
args的种类: <class 'tuple'>
args的内容: ('a', 'b', 'c', 'd', 3)
∗把调用get_case(*args)函数时接收到的多个参数a,b,c,d,3,打包成了元组 ('a', 'b', 'c', 'd', 3),然后赋值给形参args,函数中的for将元组中的值轮巡输出。
2.get_case(a,b,*args)格式:
例如:
def get_case(case1,case2,*kwargs):
for casename in args:
print(casename)
print("case1的值:",case1)
print("case2的值:", case2)
print("args的类中:",type(args))
print("args的内容:",args)
get_case("a","b","c","d",3)
输出效果:
c
d
3
case1的值: a
case2的值: b
args的类中: <class 'tuple'>
args的内容: ('c', 'd', 3)
调用get_case(case1,case2,*args) 函数时,接收到的参数("a","b","c","d",3)中,第1和2个参数分别被形参case1和case2接收,剩余的参数被打包成了元组('c', 'd', 3)
总上所述可知∗的作用是:调用函数时,函数将接受到的参数,按顺序分配给函数形参,如果遇到带*的形参,那么就把还未分配出去的实参以元组形式打包(pack),分配给带*的形参。
二.**kwargs
**kwargs可以接受随意个数的关键字参数,这些未被匹配的关键字参数会被打包成一个字典dict然后传递给变量kwargs,**的作用就是打包和解包dict中的每个元素,最终将解析出来的关键字参数传给函数的形参。拆解字典赋值给形参时,需要kwargs中的键名和函数形参的一致,否则会报错。
例如:
def get_case1(**kwargs):
for casename in kwargs:
print(casename,kwargs[casename]) #遍历kwargs元素
print("kwargs的类:",type(kwargs))
print("kwargs的内容:",kwargs)
get_case1(**{"a":1,"b":2,"c":3,"d":4})
输出:
a 1
b 2
c 3
d 4
kwargs的类: <class 'dict'>
kwargs的内容: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
三.**kwargs和args同时使用
**kwargs和args同时使用需要严格遵守顺序,例如:
def get_case2(case1,case2,*args,**kwargs):
print("case1的值:",case1)
print("case2的值:", case2)
print("args的类中:",type(kwargs))
print("kwargs的内容:",kwargs)
print("args的类:",type(args))
print("args的内容:",args)
get_case2("a","b","c","d",3,x=1,y=2)
输出:
case1的值: a
case2的值: b
args的类中: <class 'dict'>
kwargs的内容: {'x': 1, 'y': 2}
args的类: <class 'tuple'>
args的内容: ('c', 'd', 3)
说明:"a"和"b"分别赋值给case1和case2;剩下的"c"、"d"、3被打包成元组args;x=1和y=2则以字典的形式打包成字典,赋值给kwargs
最后 无论args还是kwargs都仅是一个形参的写法,也可以写成其他的字符,但是建议使用约定俗成的写法

浙公网安备 33010602011771号