问题:Python函数中的参数*args和**kwargs用法说明,谈谈你的理解
解答
*args:可变参数
可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个参数,这些可变参数在函数调用时会自动组装为一个tuple元组(Thsee arguments will be wrapped up in a tuple)
def fn(a, *args):
print('a:', a)
print('args:', args)
for i in args:
print(i)
print(type(args))
'''
a: 1
args: (2, 3, 4, 5)
2
3
4
5
<class 'tuple'>
'''
fn(1, 2, 3, 4, 5)
* 把函数fn()接受到的多个参数2,3,4,5,打包成了元组(2,3,4,5),赋值给了形参args
* 的作用:函数接受实参时,按顺序分配给函数形参,如果遇到带∗的形参,那么就把还未分配出去的实参以元组形式打包(pack),分配给那个带∗的形参args
形参args仅仅是一个约定俗成的形参的写法,你写成别的形参名也没事,但是不利于统一形式
# 定义可变参数在参数前面加了一个*号
def calc(*args):
sum = 0
for n in args:
sum = sum + n * n
return sum
# 调用calc函数时,可以传入任意个参数,包括0个参数
calc() # 0
calc(1,2,3) # 14
calc(1,3,5,7) # 84
**kwargs:关键字参数
关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict字典
形参kwargs仅仅是一个约定俗成的写法,没有其他特殊含义,换成其他的形参名也没事,但是为了代码可读性,最好还是用约定俗成的
关键字参数可以扩展函数的功能
def fn(**kwargs):
print(type(kwargs))
print(kwargs)
'''
<class 'dict'>
{'a': 1, 'b': 2, 'c': 3}
'''
fn(a=1, b=2, c=3)
def person(name, age, **kwargs):
print('name:', name, 'age:', age, 'info:', kwargs)
# 函数person除了必选参数name和age外,还接受关键字参数kwargs
# name: Andy age: 25 info: {}
person('Andy', 25)
# name: Lee age: 26 info: {'city': 'GuangZhou'}
person('Lee', 26, city='GuangZhou')
# name: Rita age: 30 info: {'gender': 'M', 'job': 'Engineer'}
person('Rita', 30, gender='M', job='Engineer')
扩展补充知识
def fn(a, b, c):
print(a, b, c)
# 1 2 3
fn(*[1, 2, 3])
# 1 2 3
fn(**{'a': 1, 'b': 2, 'c': 3})
* 用在了函数调用中,可以将打包了的实参(元组或列表),拆分(unpack)成单个的值,依次赋值给函数的形参,在本例中,打包了的实参[1, 2, 3]被拆分,1赋值给了形参a,2赋值给了形参b,3复制给了形参c
**也可用在函数调用中,可将打包的实参字典的键值拆成单个的,依次赋值给函数的形参,在本例中,打包了的实参{'a': 1, 'b': 2, 'c': 3}被拆分,1赋值给了形参a,2赋值给了形参b,3复制给了形参c
注意Tips:用**方式拆解字典给形参赋值时,需要字典的键名和函数形参一致,否则会报错
[Python] Python函数传参机制https://blog.youkuaiyun.com/Hudas/article/details/125853944