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

看了我能找到的所有关于 Lambda 的资料,我还是不明白怎么让它做我想做的事。

每个人都用这个例子:

lambda x, y : x + y

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

for example:

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)

267937 次浏览

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

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

您接受参数,但从不使用它。

Why do you need to state both x and y before the :?

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

您的错误消息意味着 Tk 使用一个参数调用您的 lambda,而您的 lambda 被写成不接受任何参数。如果你不需要论点,就接受一个,不要使用它。(Demosthenex 有密码,我本来可以发布的,但是被打败了。)

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

因为 lambda (概念上)与函数相同,只是内联编写

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

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

Also how do you make it return multiple arguments?

与函数类似,最好是返回一个元组:

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

或者一个列表,或者一个类,或者任何东西。

self.entry_1.bind的问题应该用 Demosthenex 来回答。

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

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

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

但是 lambda 里的 i 会被名字绑定,所以,

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

和你想要的不一样。