Python中函数参数传递中,*&**&*args&**kwargs用法笔记

mac2026-03-29  10

首先在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为空值 """

 

最新回复(0)