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

理解python中的lambda并使用它传递多个参数,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,在阅读了所有关于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("&

在阅读了所有关于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))
self.entry\u 1.bind(“,lambda:self.calculate(self.buttonOut\u 1.grid\u info(),1))
它会产生以下错误:

TypeError:()不接受任何参数(给定1个)


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

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))
self.entry\u 1.bind(“,lambda事件:self.calculate(self.buttonOut\u 1.grid\u info(),1))
您接受该参数,但从不使用它

为什么您需要在
之前同时声明
x
y

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

您的错误消息意味着Tk使用一个参数调用lambda,而lambda被编写为不接受任何参数。如果你不需要这个论点,就接受它,不要使用它。(,我本来会贴出来的,但是被打败了。)

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

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

def f(x, y) : return x + y
只是没有将它绑定到像
f
这样的名称

另外,如何使它返回多个参数

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

lambda x, y: (x+y, x-y)
或者一个列表,或者一个类,或者别的什么

带有
self.entry\u 1.bind的东西应该由Demosthenex回答

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

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

但是lambda中的i将受名称约束,所以

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

与您可能想要的不同。

天哪,我已经研究了这么长时间,然后我在一分钟内得到了一个有效的答案。。。顺便说一句,你知道为什么要在冒号前面吗?因为它们是函数参数。你也可以尝试“event=None”给它一个默认值,然后函数可以用于绑定和按钮。谢谢你的解释。我想我终于明白这一点了。要想真正从中得到一点好处,你可以尝试一些函数式编程,当你开始理解它时,这是一次很棒的经历,可能会让你成为一个更好的程序员。你是我的上帝,你的宣传是我的日常面包。然而,我尝试将它应用于一个元组:
(train[“pred_idx_cos”]、train[“target”])。apply(lambda x,y:get_result(x,y))
,它似乎不起作用。求你,把我的灵魂从迷雾中拯救出来programing@RevolucionforMonica回复有点晚,但下面是一个Python 3 REPL代码示例,说明如何执行此操作:
>>> flist[0]()
2
>>> flist[2]()
2
>>>