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

首先在python中,args表示不固定无key值参数,arguments。kwargs表示不固定有key值参数,keyword Variable Arguments

不固定表示:参数可以是1个,可以是多个,也可以是没有。

目的如下:

  1. 理解单个星号<*>传参的用法:将系列解包作为实参传递,实参和形参数量需匹配
  2. 理解双星号<**>传参的用法:将字典解包,取value作为实参传递,实参和形参数量需匹配
  3. 理解<*args>传参的用法:作为形参,接受不定数量参数为元组
  4. 理解<**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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值