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

c0vxltue  于 2023-05-16  发布在  Python
关注(0)|答案(4)|浏览(132)

在阅读了我能找到的关于Python中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个)

pexxcrt2

pexxcrt21#

为什么需要在“:”之前同时声明“x”和“y”?
因为lambda(概念上)与函数相同,只是内联编写。您的示例相当于

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

只是没有将它绑定到像f这样的名称。
如何让它返回多个参数?
就像一个函数一样。最好返回一个元组:

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

或者一个列表,或者一个类,或者其他什么。
关于self.entry_1.bind的问题应该由Demosthenex来回答。

qhhrdooz

qhhrdooz2#

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

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

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

zpf6vheq

zpf6vheq3#

为什么需要在:之前声明xy
因为它是一个函数定义,它需要知道函数接受什么参数,以及接受的顺序。它不能只查看表达式并使用其中的变量名称,因为其中一些名称可能需要使用现有的局部或全局变量值,即使它这样做了,它也不知道应该以什么顺序获得它们。
你的错误消息意味着Tk用一个参数调用你的lambda,而你的lambda被写成不接受参数。如果你不需要这个论点,就接受一个,不要使用它。(Demosthenex has the code,我本来要发布的,但被打败了。

eagi6jfj

eagi6jfj4#

为什么需要在“:”之前同时声明“x”和“y”?
实际上,在某些情况下(当你只有一个参数时),你可以不把x和y放在“:”之前。

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

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

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

与你想要的不同。

相关问题