理解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 >>>
不同于你可能想要的。