博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

python * 和** 可变参数

Posted on 2017-09-08 10:00  bw_0927  阅读(187)  评论(0)    收藏  举报

http://www.cnblogs.com/arkenstone/p/5695161.html

 

在python的函数中经常能看到输入的参数前面有一个或者两个星号:例如

def foo(param1, *param2):
def bar(param1, **param2):

这两种用法其实都是用来将任意个数的参数导入到python函数中。

单星号(*):*agrs
将所有参数以元组(tuple)的形式导入
例如:

>>> def foo(param1, *param2):
        print param1
        print param2
>>> foo(1,2,3,4,5)
1
(2, 3, 4, 5)



def foo(*arg):
... print arg
...
>>> a = [1, 2, 3]
>>> foo(a)
([1, 2, 3],)          #列表a作为一个整体被传入foo,被foo当作元祖的一个元素


>>> foo(*a)         #把列表a解压后传入foo, 当作元祖的三个元素
(1, 2, 3)

 


>>> def bar(*arg):
... for x in arg:    #遍历元祖,此时元祖只有一个元素,其类型是list
...     print x
...
>>> bar(a)
[1, 2, 3]
>>> bar(*a)
1
2
3



双星号(**):**kwargs
将参数以字典的形式导入

>>> def bar(param1, **param2):
        print param1
        print param2
>>> bar(1,a=2,b=3)
1
{'a': 2, 'b': 3}

此外,单星号的另一个用法是解压list参数列表

>>> def foo(bar, lee):
        print bar, lee
>>> l = [1, 2]
>>> foo(*l)
1 2


def test(a=None,b=None,c=None,d=None,e=None):
    pass

d = {"a":1,"b":2,"e":6}
test(**d)     **解压字典
 
允许不包含全部,但是d里面不能有test未定义的参数

 

当然这两个用法可以同时出现在一个函数中:例如

>>> def foo(a, b=10, *args, **kwargs):
        print a
        print b
        print args
        print kwargs
>>> foo(1, 2, 3, 4, e=5, f=6, g=7)
1
2
(3, 4)
{'e': 5, 'g': 7, 'f': 6}

参考资料: http://stackoverflow.com/questions/36901/what-does-double-star-and-star-do-for-python-parameters

 

 

def test_var_args2(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])
    if "hi" in kwargs:
        print kwargs["hi"]

#test_var_args2(1, "two"=3)
test_var_args2(1, two=3, hi="4")