理解Python双星和单星对参数的作用


理解Python中双星(**)和单星(*)对参数的作用

传递多个参数可以使用*args,或者**kwargs

*args参数为一个元组

In [1]: def foo(*args):
   ...:     for a in args:
   ...:         print a
   ...:         
   ...:         

In [2]: foo(1)
1


In [4]: foo(1,2,3)
1
2
3

**kwargs会给你所有的 关键字参数除了那些与作为字典的形式参数。

In [5]: def bar(**kwargs):
   ...:     for a in kwargs:
   ...:         print a, kwargs[a]
   ...:         
   ...:         

In [6]: bar(name='one', age=27)
age 27
name one

这两个习语都可以与普通参数混合,以允许一组固定和一些变量参数:

def foo(kind, *args, **kwargs):
   pass

*l习惯用法的另一个用法是在调用函数时解包参数列表。

In [9]: def foo(bar, lee):
   ...:     print bar, lee
   ...:     
   ...:     

In [10]: l = [1,2]

In [11]: foo(*l)
1 2

在Python 3中,可以*l在赋值的左侧使用(Extended Iterable Unpacking),尽管在此上下文中它给出了一个列表而不是一个元组:

first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]

Python 3也增加了新的语义(参考PEP 3102):

def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
    pass

这样的函数只接受3个位置参数,后面的所有内容*只能作为关键字参数传递。