理解 python 中的 lambda 并使用它来传递多个参数

Posted

技术标签:

【中文标题】理解 python 中的 lambda 并使用它来传递多个参数【英文标题】:Understanding lambda in python and using it to pass multiple arguments 【发布时间】:2012-05-07 21:15:26 【问题描述】:

在阅读了我在 lambda 上可以找到的所有内容后,我仍然不明白如何让它做我想做的事情。

大家都用例子:

lambda x, y : x + y

为什么需要在: 之前同时声明xy?还有如何让它返回多个参数?

例如:

self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

这很好用。但是下面的代码没有:

self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

它会产生错误:

TypeError: () 不带参数(给定 1 个)

【问题讨论】:

【参考方案1】:

为什么需要在: 之前同时声明xy

因为它是一个函数定义,它需要知道函数接受哪些参数,以及以什么顺序。它不能只查看表达式并使用其中的变量名称,因为其中一些名称您可能希望使用现有的局部或全局变量值,即使它这样做了,它也不知道它的顺序应该期望得到它们。

您的错误消息意味着 Tk 使用一个参数调用您的 lambda,而您的 lambda 被编写为不接受任何参数。如果您不需要参数,只需接受一个并且不要使用它。 (Demosthenex has the code,我本来会发的,但被打了。)

【讨论】:

感谢您的解释。我想我终于明白了这一点。【参考方案2】:

为什么要在 ':' 之前同时声明 'x' 和 'y'?

您实际上可以在某些情况下(当您只有一个参数时)不要将 x 和 y 放在 ":" 之前。

>>> flist = []
>>> for i in range(3):
...     flist.append(lambda : i)

但是 lambda 中的 i 将被名称绑定,所以,

>>> flist[0]()
2
>>> flist[2]()
2
>>>

与您可能想要的不同。

【讨论】:

【参考方案3】:

为什么要在 ':' 之前同时声明 'x' 和 'y'?

因为 lambda (在概念上)与函数相同,只是内联编写。你的例子相当于

def f(x, y) : return x + y

只是没有将其绑定到像 f 这样的名称。

还有如何让它返回多个参数?

就像函数一样。最好返回一个元组:

lambda x, y: (x+y, x-y)

或者一个列表,或者一个类,或者其他什么。

self.entry_1.bind的东西应该由Demosthenex回答。

【讨论】:

要真正从它们中学到最少,您可能会尝试一些函数式编程,当您开始理解它时,这是一种很棒的体验,并且可能会让您成为更好的程序员 你是我的上帝,你的宣传是我的日常面包。然而,我尝试将它应用于一个元组:(train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y)),它似乎不起作用。请从程序编程的迷雾中拯救我的灵魂 @RevolucionforMonica 回复有点晚,但这里有一个 Python 3 REPL 代码示例,说明如何做到这一点:repl.it/@foobar123/ScarceWhimsicalMainframe【参考方案4】:

我相信 bind 总是试图发送一个事件参数。试试:

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))

您接受该参数并且从不使用它。

【讨论】:

omg,我一直在研究这个问题,然后我在 1 分钟内得到了一个有效的答案......顺便说一句,你知道为什么事情会出现在冒号前面吗?跨度> 因为它们是函数参数 你也可以试试“event=None”给它一个默认值,然后这个函数就可以用于绑定和按钮了。

以上是关于理解 python 中的 lambda 并使用它来传递多个参数的主要内容,如果未能解决你的问题,请参考以下文章

lambda 函数中的 python 和 python-jose 错误

Python:lambda表达式和yield关键字理解与使用讲解

奇怪的行为:列表理解中的 Lambda

自己理解Java中的lambda

python中的lambda函数发生了啥?

等效于 Java 中的 Python 的 lambda 函数?