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被打包成元组argsx=1和y=2则以字典的形式打包成字典,赋值给kwargs

最后 无论args还是kwargs都仅是一个形参的写法,也可以写成其他的字符,但是建议使用约定俗成的写法

 
posted @ 2023-05-21 21:58  771293871  阅读(74)  评论(0)    收藏  举报