首先在python中,args表示不固定无key值参数,arguments。kwargs表示不固定有key值参数,keyword Variable Arguments
不固定表示:参数可以是1个,可以是多个,也可以是没有。
目的如下:
- 理解单个星号<*>传参的用法:将系列解包作为实参传递,实参和形参数量需匹配
- 理解双星号<**>传参的用法:将字典解包,取value作为实参传递,实参和形参数量需匹配
- 理解<*args>传参的用法:作为形参,接受不定数量参数为元组
- 理解<**kwargs>传参的用法:作为形参,接受不定数量参数为字典
""" 各种数据结构作为实参传递测试 """
def func1(a, b, c, d): # 定义一个带有4个形参的函数
return a, b, c, d # 返回4个参数的值
print(f"常规传参结果:{func1(2, 1.1, True, '1')}") # >>> 常规传参结果:(2, 1.1, True, '1')
print(f"关键字传参结果:{func1(2, 1.1, c=True, d='1')}") # >>> 关键字传参结果:(2, 1.1, True, '1')
l = [1.1, True, '1'] # 定义一个列表作为参数,1个值+*l作为实参
print(f"列表传参结果:{func1(2, *l)}") # >>> 列表传参结果:(2, 1.1, True, '1')
t = (True, '1') # 定义一个元组作为参数,2个值+*t作为实参
print(f"元组传参结果:{func1(2, 1.1, *t)}") # >>> 元组传参结果:(2, 1.1, True, '1')
s = {2, 1.1, True, '1'} # 定义一个集合作为参数,*s作为实参
print(f"集合传参结果:{func1(*s)}") # >>> 集合传参结果:(1.1, 2, '1', True)
print(f"系列range传参结果:{func1(*range(4))}") # >>> 系列range传参结果:(0, 1, 2, 3)
d = {'a': 2, 'b': 1.1, 'c': True, 'd': '1'} # 定义一个字典作为参数,*d和**d作为实参
print(f"字典传参结果:{func1(*d)} 单*号") # >>> 字典传参结果:('a', 'b', 'c', 'd') 单*号
print(f"字典传参结果:{func1(**d)} 双**号") # >>> 字典传参结果:(2, 1.1, True, '1') 双**号
""" 结论
1.常规传参,实参和形参一一对应,不需要*号
2.系列传参,包括列表,元组,集合,range作为实参传递,需带一个*解包
3.字典传参,带一个*传递的实参为key,带两个**号传递的实参为value
4.混合传参,参数个数完全匹配的情况下,以上传参方式可以混合使用。
如下:
"""
a = 2 # 定义单个变量a
l = [1.1, True] # 定义2个元素的列表
d = {'d': '1'} # 定义含有1个键值对的字典
print(f"混合传参结果:{func1(a, *l, **d)}") # >>> 混合传参结果:(2, 1.1, True, '1')
""" *args和**kwargs用法测试 """
def func2(a, b, *args, **kwargs): # 定义一个带有不定参数函数
print('变量a的值:', a) # >>> 变量a的值: 1
print('变量b的值:', b) # >>> 变量b的值: (2, 3)
print('不定变量args的值:', args) # >>> 不定变量args的值: (4,)
print('不定变量*args的值:', *args) # >>> 不定变量*args的值: 4
print('不定变量kwargs的值:', kwargs) # >>> 不定变量kwargs的值: {'c': 5, 'd': 6, 'e': 7}
print('不定变量*kwargs的值:', *kwargs) # >>> 不定变量*kwargs的值: c d e
try:
print('不定变量**kwargs的值为:', **kwargs) # 测试会报错
except Exception as e:
print(e) # >>> 'c' is an invalid keyword argument for print()
func2(1, (2, 3), 4, c=5, d=6, e=7)
# func2(1, (2, 3), c=5, d=6, e=7) 测试代码1:运行后*args为空
# func2(1, (2, 3), 4, 5) 测试代码2:运行后**kwargs为空
""" 结论
1.常规固定匹配,固定数量和依次匹配即:a=1, b=(2,3)。
注:若数量或类型匹配不上,会报错
2.*args不定匹配,匹配中间元素(常规匹配后-关键字匹配前),args返回的必定是元组。
注:若中间没有元素'4',返回的将是空元组。解包后*args将是空值
3.**kwargs不定匹配,匹配关键字实参,kwargs返回的必定是字典,*kwargs返回key。
注:若后面没有关键字实参,则不匹配,返回空字典。*kwargs为空值
"""