Lambda和Python中的函数

时间:2011-03-08 12:52:41

标签: python

我有初学者两个问题

  1. *z*foo**foo对Python中的功能有何意义。
  2. 这有效 - a = lambda *z :z但这不是 - a = lambda **z: z。因为它应该采用0参数。这究竟意味着什么?

4 个答案:

答案 0 :(得分:20)

Python中的

*z**z指的是args和kwargs。 args是位置参数,kwargs是关键字参数。 lambda **z在您的示例中不起作用,因为z不是关键字参数:它只是位置。比较这些不同的结果:

    >>> a = lambda z: z
    >>> b = lambda *z: z
    >>> c = lambda **z: z
    >>> a([1,2,3])
    [1, 2, 3]
    >>> b([1,2,3])
    ([1, 2, 3],)
    >>> c([1,2,3]) # list arg passed, **kwargs expected
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: <lambda>() takes exactly 0 arguments (1 given)
    >>> c(z=[1,2,3]) # explicit kwarg
    {'z': [1, 2, 3]}
    >>> c(x=[1,2,3]) # explicit kwarg
    {'x': [1, 2, 3]}
    >>> c({'x':[1,2,3]}) # dict called as a single arg
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: <lambda>() takes exactly 0 arguments (1 given)
    >>> c(**{'x':[1,2,3]}) # dict called as **kwargs
    {'x': [1, 2, 3]}
    >>> b(*[1,2,3]) # list called as *args
    (1, 2, 3)

答案 1 :(得分:4)

查看链接,这是一篇关于如何在Python中使用* args和** kwargs的好文章 http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/

答案 2 :(得分:4)

当你看到类似def foo(*args)def foo(**kwargs)的内容时,他们会告诉你他们期待的不仅仅是一个论点。他们期待几个参数或几个命名参数。但是,你经常会看到这个:

def foo(item1, item2, item3, *args, **kwargs)

这告诉你他们至少期望项目的1,2和3,但“args”和“kwargs”是可选参数。

要回答有关a = lambda **z: z的问题,请尝试传递“命名参数列表”,如下所示:

> a = lambda **z:z
> a(b=1, c=2)
>> {b : 1, c : 2}

输出将是一个字典,就像你无意中定义的一样。命名参数列表实质上是字典。

答案 3 :(得分:2)

*args可用于使函数采用任意数量的参数。 **kwargs可用于使函数采用任意关键字参数。这意味着:

>>> foo = lambda *args: args
>>> bar = lambda **kwargs: kwargs
>>> foo(1,2,3)
(1,2,3)
>>> bar(asdf=1)
{'asdf':1}
>>> bar(1,2,3)
TypeError: <lambda>() takes exactly 0 arguments (3 given)

发生最后一个错误是因为bar只能接收关键字参数。