Python中单个星号*(*args)和两个星号**(**kwargs)的作用分别是什么?

Code提问如下:

在以下方法定义中,***对于param2分别是什么含义呢?

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

Code回答如下:

单个星号和双星号的作用

*args**kwargs是一个常见的语法,允许任意数量的参数到Python文档中的more on defining functions部分所述的函数。
*args将给你所有的功能参数as a tuple

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将给你所有字典参数keyword arguments,参考下面的代码:

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语法的另一个用法是调用函数时unpack argument lists,也就是参数的扩展,什么意思呢:

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

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

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

Python 3中单星号的新语法

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

first, *rest = [1,2,3,4]
# rest = [2, 3, 4]

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

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

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

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

By Code问答

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 21 = 26