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

在阅读了所有关于lambda的信息之后,我仍然不明白如何使其达到我想要的水平。

每个人都用这个例子

lambda x, y : x + y 

为什么你需要在':'之前同时声明'x'和'y'? 另外你如何让它返回多个参数?

例如:

 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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

但是lambda中的我将被名字绑定,所以,

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

不同于你可能想要的。