Python中*args 和**kwargs的用法

 

 

*

例1

def fun(a,b,c):
    print a,b,c

fun(1,2,3)
L=(4,5,6)
fun(*L)

输出

1 2 3
4 5 6

例2

def fun(a,b,c):
    print a,b,c

fun(1,2,3)
L=(5,6)
fun(7,*L)

输出

1 2 3
7 5 6

*在这里的作用是把一个tuple(元组)拆分一个一个个的元素
*+一个tuple等效与把tuple中的各个元素看成单独的

*args

以下面代码为例

def fun(a,b,*args):
    print a,b
    print args

fun(2,122,1213,'3434','s','sdwf','243rds')

输出

2 122
(1213, '3434', 's', 'sdwf', '243rds')

函数 fun(a,b,*args)是接受至少2个参数其中分别赋值给变量a,b;则args为一个空的tuple;若大于两个则除去第一第二的,其余全部构成一个tuple,如果有list,tuple或者dict就是那个tuple的元素。

**

def fun(a,b,c):
    print a,b,c

d={'c':9}
fun(4,6,d)
fun(4,6,**d)
fun(1,2,**{'c':0})

输出

4 6 {'c': 9}
4 6 9
1 2 0

例2

def fun(a,b,c):
    print a,b,c

p={'a':7}
fun(4,7,**p)

输出

in <module>
    fun(4,7,**p)
TypeError: fun() got multiple values for keyword argument 'a'

例3

def fun(a,b,c):
    print a,b,c

q={'d':8}
print fun(2,5,**q)

输出

 in <module>
    print fun(2,5,**q)
TypeError: fun() got an unexpected keyword argument 'd'

综上所述:
只用于dict,若在函数中使用**dict,则dict的key值必须于形参命一致才能正确传参,否则报错,其中形参值为dict中key所对应的value

**kwary

def fun(a,**kwargs):
    print a
    print kwargs

fun(1,e=1,c=3,d=7,b=9)

输出

1
{'c': 3, 'b': 9, 'e': 1, 'd': 7}

例2

def fun(a,**kwargs):
    print a
    print kwargs

fun(1,a=1,c=3,d=7,b=9)

输出

in <module>
    fun(1,a=1,c=3,d=7,b=9)
TypeError: fun() got multiple values for keyword argument 'a'

综上所述:
**kwarys是生成dict的,其中赋值号左值为key,右值为value;且其中key不能与函数前面的形参同名。