我有初学者两个问题
*z
或*foo
或**foo
对Python中的功能有何意义。a = lambda *z :z
但这不是 - a = lambda **z: z
。因为它应该采用0参数。这究竟意味着什么?答案 0 :(得分:20)
*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
只能接收关键字参数。