我知道使用时*args
,这意味着我们不确定该函数将要接收多少个参数。但是,Python最终将它们绑定到一个元组中:
>>> def f(*args):
return type(args)
>>> f(3,4,4,5)
<class 'tuple'>
假设我有一个简单的函数,可以使输入保持不变。我可以将其与嵌套lambda一起使用,如下所示:
>>> def f (x):
return x
>>> l = f(lambda x: len(x))
>>>
>>> l((1,2,3))
3
请注意,输入是一个元组。但是,当我尝试使用编写相同的函数时,会发生这种情况args
:
>>> def f (*args):
return args
>>> l = f(lambda x: len(x))
>>> l((1,2,3))
Traceback (most recent call last):
File "<pyshell#106>", line 1, in <module>
l((1,2,3))
TypeError: 'tuple' object is not callable
为什么会收到此错误,应该如何避免?
在第二个示例中,l
未分配给您认为的内容:
>>> def f (*args):
... return args
...
>>> l = f(lambda x: len(x))
>>> l
(<function <lambda> at 0x020518A0>,)
>>>
如您所见,它是一个包含lambda函数的元组。但是这是可以预期的,因为*args
总是将其参数收集到一个元组中,f
然后函数将返回该元组。
稍后,当您这样做时:
l((1,2,3))
一个TypeError
是上调试图调用元组l
的功能。
您可以通过简单地索引元组以提取lambda函数来避免此错误:
l = f(lambda x: len(x))[0]
现在l
指的是:
>>> def f (*args):
... return args
...
>>> l = f(lambda x: len(x))[0]
>>> l
<function <lambda> at 0x020169C0>
>>> l((1,2,3))
3
>>>
尽管,正如@abarnert在其评论中所说,看来您实际上是在尝试l
采用可变数量的参数。如果是这样,那么您需要*args
在lambda上使用,而不是function f
:
>>> def f(x):
... return x
...
>>> l = f(lambda *args: len(args))
>>> l(1, 2, 3, 4, 5)
5
>>>
请记住,执行此操作时l(...)
,将调用lambda。因此,您提供的任何参数l
都将发送到那里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句