在python中,这两个是python中的可变参数,*arg表示任意多个无名参数,类型为tuple,**kwargs表示关键字参数,为dict,使用时需将*arg放在**kwargs之前,否则会有“SyntaxError: non-keyword arg after keyword arg”的语法错误。
*args
称之为Non-keyword Variable Arguments
**kwargs
称之为keyword Variable Arguments
def foo(*b,**c): print 'args = ', b print 'kwargs = ', c print '---------------------------------------' if __name__ == '__main__': foo(1,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a=1,b=2,c=3) foo('a', 1, None, a=1, b='2', c=3) foo('a',1,a=1,b=2)
运行结果:
args = (1, 2, 3, 4)
kwargs = {}
---------------------------------------
args = ()
kwargs = {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args = (1, 2, 3, 4)
kwargs = {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args = ('a', 1, None)
kwargs = {'a': 1, 'c': 3, 'b': '2'}
---------------------------------------
args = ('a', 1)
kwargs = {'a': 1, 'b': 2}
---------------------------------------
args 和 kwargs 只是推荐名字,其实你可以使用任意的变量名的
名称可以不用是*args和**kwargs,不过大部分的代码都是这个名称。
就像foo(*b,**c) 也是可以的,但是必须是*b在**c之前,否则会出现SyntaxError: invalid syntax错误。
1、错误情况一:
def foo(**c,*b):
^
SyntaxError: invalid syntax
2、错误情况二:
def foo(*b,*c):
^
SyntaxError: invalid syntax
-------------------------------------------------------------------------------------------------------
再扩展一下:
看下这个函数
def func(a,b,c=0,*args,**kw): print 'a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw
args = ('9','k') kw = {'x':99} func(*args,**kw)
运行结果:
a= 9 b= k c= 0 args= () kw= {'x': 99}
-----------------------------------------------------------
args = ('9') kw = {'x':99} func(*args,**kw)
运行结果:
func(*args,**kw)
TypeError: func() takes at least 2 arguments (1 given)
----------------------------------------------------------
args = ('9','kl') kw = {'x':99} func(1,*args,**kw)
运行结果:
a= 1 b= 9 c= kl args= () kw= {'x': 99}
-----------------------------------------------------------
大家可以思考下为什么?哈哈