*args 表示任何多个无名参数,它是一个tuple
**kwargs 表示关键字参数,它是一个dict
注意:同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,
像foo(a=1, b=’2’, c=3, a’, 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”
下面是在python 命令行写的简单测试:
>>> def fun(*args, **kwargs):
... print 'args = ', args
... print 'kwargs = ', kwargs
... print '###'
...
>>> fun(1,2,3,4)
args = (1, 2, 3, 4)
kwargs = {}
###
>>> fun(a=1,b=2,c=3,d=4)
args = ()
kwargs = {'a': 1, 'c': 3, 'b': 2, 'd': 4}
###
>>> fun(1,2,3,4,a=1,b=2,c=3,d=4)
args = (1, 2, 3, 4)
kwargs = {'a': 1, 'c': 3, 'b': 2, 'd': 4}
###
>>> fun('a', 1, None, a=1, b='2', c=3)
args = ('a', 1, None)
kwargs = {'a': 1, 'c': 3, 'b': '2'}
###
>>> fun( a=1, b='2', c=3,'a',1,None)
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> fun( a=1, b='2', 'a',1,None,c=3)
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>>
* 和 ** 也可以用在string.format的时候, 用 ** 后可以直接引用key的值,写起来更简洁
>>> kwargs = {'a': 1, 'c': 3, 'b': 2, 'd': 4}
>>> "a is {kwargs[a]}, b is {kwargs[b]},c is {kwargs[c]} ,d is {kwargs[d]}".format(kwargs=kwargs)
'a is 1, b is 2,c is 3 ,d is 4'
>>> "a is {a}, b is {b},c is {c} ,d is {d}".format(**kwargs)
'a is 1, b is 2,c is 3 ,d is 4'