改编代码发现有个**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}