一 可变参数 Variable Argument
# 可变参数(Variable Argument) *args **kwargs
# 注意:
# *表示元组 **表示字典
# *和**用于形参表示接收不定长参数(pack),用于实参表示拆包(unpack)
# *args必须位于**kwargs之前,且都位于正常参数之后
# * 和 ** 之后的参数名可以任意
# *一般使用*args,可变的positional arguments (位置参数列表)
# **一般使用**kwargs, 可变的keyword arguments (关键字参数 键值对参数)
# 其他示例:*a *ar *arg *num都可以表示元组,**k **kw **kwa **kwar **temp都可以表示字典
# 可变参数作为参数时前面要带* 和 **,但是当在使用时就不需要*和**了,直接使用参数名就可以了。
# 一个函数中,若*args **kwargs代表形参,那么在使用时,可以直接args代表元组,kwargs代表字典
# 若args代表元组,kwargs代表字典,那么在使用时,要使用带*和**的*args **kwargs作为实参传入函数
# 若一个函数以*args, **kwargs作为形参,
# 那么其可以接收一个元组、字典作为参数,要进行元组’字典的拆包
# 也可以将参数直接写入函数参数位置,
# 在没有正常参数的情况下,所有单个参数表示*args,所有键值对表示**kwargs
# 若有正常参数的话,出去正常参数(一般放在最前面)后,所有单个参数表示*args,所有键值对表示**kwargs
示例1
def var_arg1(*args, **kwargs):
print(args) # 代码中使用参数名就可以不用带* 和**
print(kwargs)
# 元组和字典作
args = (1, 2, 3)
kwargs = {'name': '小明', 'age': 18}
# 元组和字典作为实参,要进行拆包
var_arg1(*args, **kwargs) # (1, 2, 3) {'name': '小明', 'age': 18}
# 将参数直接写入函数参数位置,拆包语法等同于这里代码
var_arg1(1, 2, 3, name='小明', age=18) # (1, 2, 3) {'name': '小明', 'age': 18}
示例2
def var_arg2(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
# 元组和字典
args = (1, 2, 3)
kwargs = {'name': '小明', 'age': 18}
# 因形参中有普通参数,会先满足普通参数然后再给可变参数
var_arg2(*args, **kwargs) # 1 (2, 3) {'name': '小明', 'age': 18}
#
var_arg2(1, 2, 3, name='小明', age=18) # 1 (2, 3) {'name': '小明', 'age': 18}