先来看个例子:
def foo(*args, **kwargs):
print 'args = ', args
print 'kwargs = ', kwargs
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)
输出结果如下:
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'}
---------------------------------------
可以看到,这两个是python中的可变参数。*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”。
在使用*args时要注意,在一个函数里面如果既有确定参数,又有不确定参数时(元组类型的不确定参数),调用函数时,给确定参数赋值,不能用"=",否则会报错。
In [1]: def test(a,b,c=100,*args):
...: print "a:",a
...: print "b:",b
...: print "c:",c
...: for i in args:
...: print "i:",i
...:
In [2]: test(20,10,50,200,300,400)
a: 20
b: 10
c: 50
i: 200
i: 300
i: 400
In [3]: test(b=20,a=10,c=50,200,300,400)
File "<ipython-input-3-b174f70470b5>", line 1
test(b=20,a=10,c=50,200,300,400)
SyntaxError: non-keyword arg after keyword arg
可以不给不确定参数赋值:
In [4]: test(b=20,a=10,c=50)
a: 10
b: 20
c: 50
如果是字典类型的不确定参数,可以用"="赋值:
In [10]: def test(a,b,c=200,**kwargs):
....: print "a:",a
....: print "b:",b
....: print "c:",c
....: for value in kwargs:
....: print "%s:%s"%(value,kwargs[value])
....:
In [11]: test(b=20,a=10,c=100,mm=20,nn=10,xsk=1)
a: 10
b: 20
c: 100
mm:20
xsk:1
nn:10
也可以用下面的形式:
In [26]: def test(arg1,arg2,arg3):
....: print "arg1:",arg1
....: print "arg2:",arg2
....: print "arg3:",arg3
....:
In [27]: args = ["two",1]
In [28]: test(2,*args)
arg1: 2
arg2: two
arg3: 1
In [40]: def test(a1,a2,a3):
....: print "a1:",a1
....: print "a2:",a2
....: print "a3:",a3
....:
In [41]: kwargs = {"a3":"you","a2":"love"}
In [42]: test("i",**kwargs)
a1: i
a2: love
a3: you