nJcx's Blog

生而不忧,死而不怖。得其时横刀天下,不得其时蓬头而行。

Python 的 *args和 **kwargs


介绍

首先,我们并不是一定要写成*args 和 **kwargs,关键是前面的* 和 **,换句话说,我们也可以*var 和 **var,这个只是大家约定熟成的方式,我们也可以换成其他的,既然,大家这样写,那么也推荐大家这样写。

开始

*args 和 **kwargs主要用于函数定义。你可以将不定数量的参数传递给一个函数。这里的不定的意思是:预先并不知道,函数使用者会传递多少个参数给你,所以在这个场景下使用这两个关键字。*args是用来发送一个非键值对的可变数量的参数列表给一个函数.这里有个例子帮你理解这个概念:

In [6]: def demo(args_f,*args_v):
        print args_f
        for x in args_v:
                print x
   ...:         

In [7]: demo('a','b','c','d')
a
b
c
d

**kwargs允许你将不定长度的键值对,作为参数传递给一个函数。如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs。这里有个例子帮你理解这个概念:

In [1]: def demo(**args_v):
   ...:         for k,v in args_v.items():
   ...:                 print k,v
   ...: 

In [2]: demo(name='njcx')
name njcx

我们也可以把一个已经存在的list,tuple和dict构造成*args 和 **kwargs传进函数里面,这里有个例子:

In [17]: %paste

def demo(*args_f,**args_v):
    for x in args_f:
        print x        
    for k,v in args_v.items():
        print k+'='+v

list1 = [1,2,3]

dict = {'a':'A','b':'B','c':'C'}

demo(*list1,**dict)

## -- End pasted text --
1
2
3
a=A
c=C
b=B

In [18]: 

那么函数里同时使用所有三种参数,顺序怎么样的呢?我们可以这样写 def demo(fargs,*args,**kwargs):

前面我们明确指定了,*args 和 **kwargs做为函数的参数,如果,我们没有指定*args 和 **kwargs,我们定义的函数是这样的def demo(fargs,fargs1,fargs2): 我们怎么用*args 和 **kwargs把参数传到函数里面?

In [18]: %paste
list1 = [1,2,3]

dict = {'arg2':'A','arg1':'B','arg3':'C'}

def demo(arg1,arg2,arg3):
       print "arg1:", arg1
       print "arg2:", arg2
       print "arg3:", arg3

demo(*list1)
demo(**dict)

## -- End pasted text --
arg1: 1
arg2: 2
arg3: 3
arg1: B
arg2: A
arg3: C

In [19]: 

注意:我们构造的字典是参数是一一对应的。