Python:细说函数传参中的*args和**kwargs

# 可变参数 *args
# 关键字参数 **kwargs

# *args用于传入若干个可变参数,这些参数可以是异构的,并且以元组的方式传入函数
# **kwargs用于传入关键字参数,这些参数带有关键字,并且可以以字典的方式传入函数
# 如果一个函数,既要传入可变参数又要传入关键字参数,分界点为*,...和**... 

dic = {'a':1, 'b':2}
lst = [1, 2, 3]
tup = (4, 5, 6)

def test(*args, **kwargs):
    print(args) # 这里的args实际上是一个元组,因此传进去的时候最好解包一下
    print(kwargs) # 这里实际上是一个字典

test(tup, dic) # 没有看见*和**,默认全部传进第一个,第二个为空
# ((4, 5, 6), {'a': 1, 'b': 2}) tup和dic这两个元素被转进一个元组
# {}

test(*tup, dic) # 先让tup解包成4, 5, 6,然后和dic这四个元素一起传入第一个元素,第二个元素仍为空
# (4, 5, 6, {'a': 1, 'b': 2})
# {}

test(*tup, **dic) # 传入的tup本来是((4, 5, 6),),解包成(4, 5, 6)
# (4, 5, 6)
# {'a': 1, 'b': 2}

test(tup, **dic) # tup未解包,并且**dic传入第二个参数
# ((4, 5, 6),)
# {'a': 1, 'b': 2}

test(0, 2, 5, lst, *tup, **dic, c = 6) # 第一个参数碰到**dic的时候就知道该结束了,同时添加新的kv
# (0, 2, 5, [1, 2, 3], 4, 5, 6)
# {'a': 1, 'b': 2, 'c': 6}

test(0, 2, 5, lst, tup, c = 6, **dic) # 将c = 6放到**dic前面也没事,只要遇到关键字参数就知道该结束了
# (0, 2, 5, [1, 2, 3], (4, 5, 6))
# {'c': 6, 'a': 1, 'b': 2}

test(c = 6) # 只传入关键字表达式,相当于第一个参数传入()
# ()
# {'c': 6}

test(**dic) # 同上
# ()
# {'a': 1, 'b': 2}

test(*dic) # 当字典只带一个*的时候,默认为所有key之间隔着空格,但是并不组成元组,因此相当于只传入第一个参数,并组成元组
# ('a', 'b')
# {}

#验证上面那个例子
print(*dic) # a b

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值