*args和**kwargs

改编代码发现有个**kwargs,大致理解但是还是上网查了下,经常是与*args放在一起说的,就一起记录下吧。

简单来说*args是个元组,**kwargs是字典。(疑问不理解args为何是元组而不是列表)但是打印出来就是元组

 

def test(*args,**kwargs):
    print args
    #print *args
    print type(args)
    #print type(*args)
    print kwargs
    #print **kwargs
    print type(kwargs)
    #print type(**kwargs)


test(sys.argv[1],sys.argv[2])

参考原文:https://www.cnblogs.com/zhangzhuozheng/p/8053045.html,但是我实际疑问还是没有解决,看疑问二继续查询

疑问2:** * 什么鬼:

python中,在形参前面加上“*”和“**”,称为动态参数

忽然意识到自己钻了牛角尖,各个地方看到的args和kwargs只是一个变量名(尴尬脸)

加“*”时,函数可接受任意多个参数,全部放到一个元组中,这就是为什么之前传入那么多参数,最后都成了一个元组,加“**”时,函数接受参数时,返回为字典。那就奇怪了,发现之前传入的两个参数都变成了两个字符串,被当做元组的元素添加进去了,重新写了个函数:

>>> def test(*t,**d):
...     print t
...     print d
...     print 't_type:%s' %type(t)
...     print 'd_type:%s' % type(d)

>>> test(1,2,3,4,a=3,b=4,c=1)
(1, 2, 3, 4)
{'a': 3, 'c': 1, 'b': 4}
t_type:<type 'tuple'>
d_type:<type 'dict'>

可以看到,自动的把前面的单个元素汇集成了一个元组,后面的键值对形成了一个字典。

接下来一波无脑操作,发现只能键值对,不能是直接的字典形式,我就懵了。

>>> test(1,2,3,4,a=3,b=4,c:1)
  File "<stdin>", line 1
    test(1,2,3,4,a=3,b=4,c:1)
                          ^
SyntaxError: invalid syntax
>>> test(1,2,3,4,a=3,b=4,{c:1})
  File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> test(1,2,3,4,{c:1})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
>>> test(1,2,3,4,{'c':1})
(1, 2, 3, 4, {'c': 1})
{}
t_type:<type 'tuple'>
d_type:<type 'dict'>

灵光乍现,忽然意识到*,**丢了,

>>> type(a)
<type 'dict'>
>>> test(1,2,3,4,**a)
(1, 2, 3, 4)
{'c': 3, 'b': 2}
t_type:<type 'tuple'>
d_type:<type 'dict'>
>>> test(1,2,3,4,*{'c':1})
(1, 2, 3, 4, 'c')
{}
t_type:<type 'tuple'>
d_type:<type 'dict'>
>>> test(1,2,3,4,**{'c':1})
(1, 2, 3, 4)
{'c': 1}
t_type:<type 'tuple'>
d_type:<type 'dict'>

完美解决,就是**的问题,论* 与**的用法,有人说不能把**放在*前,下面开始实验,果然如此,并且不能连续两个元组呢:

>>> def te(**d,*t ):
  File "<stdin>", line 1
    def te(**d,*t ):
              ^
SyntaxError: invalid syntax
>>> def te(*d,*t ):
  File "<stdin>", line 1
    def te(*d,*t ):
              ^
SyntaxError: invalid syntax
>>> def te(*d,**t ):
...     print d,t

总结,*可以接受多个字符或者数值返回为元组,**可以接受多个键值对或者字典,返回形式为字典。

作死又试了下,明天再来,发现键值对在前可以与后面列表合并,但是键值对在后并不能合并

>>> te(1,**{'a':123},b=2)
  File "<stdin>", line 1
    te(1,**{'a':123},b=2)
                    ^
SyntaxError: invalid syntax
>>> te(1,**{'a':123})
(1,) {'a': 123}
>>> te(1,b=2,**{'a':123})
(1,) {'a': 123, 'b': 2}

参考原文:https://www.cnblogs.com/omg-hxy/p/9081177.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值