带* args的lambda表达式

奥米德

我知道使用时*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

为什么会收到此错误,应该如何避免?

用户2555451

在第二个示例中,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采用可变数量的参数。如果是这样,那么您需要*argslambda上使用,而不是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带空括号的Lambda表达式()

来自分类Dev

带参数的异步lambda表达式

来自分类Dev

带列表操作的Lambda表达式

来自分类Dev

If/if - else/ else 带 lambda 表达式

来自分类Dev

带条件的嵌套循环的Java Lambda表达式

来自分类Dev

带.Where子句的Lambda表达式,使用包含

来自分类Dev

使用带日期的lambda表达式与众不同

来自分类Dev

带Lambda表达式中的Join的where子句

来自分类Dev

带类的 C# Lambda 表达式

来自分类Dev

带OR的Xpath表达式

来自分类Dev

Django-带表达式的模板

来自分类Dev

带正则表达式的MaskFormatter

来自分类Dev

带条件的正则表达式

来自分类Dev

带if条件的正则表达式

来自分类Dev

带表达式的C ++模板参数

来自分类Dev

带grep的正则表达式

来自分类Dev

Django-带表达式的模板

来自分类Dev

带括号的C ++表达式

来自分类Dev

带条件的正则表达式

来自分类Dev

带正则表达式的grep

来自分类Dev

带计数的正则表达式

来自分类Dev

带lambda表达式的invokeAndWait在静态初始化程序中永久挂起

来自分类Dev

“带注释” lambda表达式,而不是使用单个apply方法的接口

来自分类Dev

带主体的lambda表达式的确切类型是什么?

来自分类Dev

实体框架6在带lambda表达式的where子句中使用父代

来自分类Dev

“带注释的” lambda表达式,而不是使用单个apply方法的接口

来自分类Dev

LastName,FirstName带空格的正则表达式

来自分类Dev

带警报的正则表达式名称测试

来自分类Dev

带占位符的正则表达式