105

在阅读了我在 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 个)

4

4 回答 4

152

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

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

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

只是没有将它绑定到像f.

另外你如何让它返回多个参数?

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

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

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

self.entry_1.bind应该由Demosthenex回答的事情。

于 2012-04-27T05:43:40.427 回答
13

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

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

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

于 2012-04-27T05:38:03.043 回答
6

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

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

您的错误消息意味着 Tk 正在使用一个参数调用您的 lambda,而您的 lambda 被编写为不接受任何参数。如果您不需要参数,只需接受一个并且不要使用它。(Demosthenex 有代码,我会发布它但被打败了。)

于 2012-04-27T05:43:06.560 回答
4

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

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

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

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

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

与您可能想要的不同。

于 2014-04-17T22:36:14.233 回答