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


90

阅读完我可以在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个)

Answers:


135

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

因为lambda(在概念上)与函数相同,所以仅内联编写。您的示例等效于

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

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

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

与功能相同。最好返回一个元组:

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

或列表,类或其他内容。

self.entry_1.bindDemosthenex应该回答与的事情。


2
要真正从中获得最少的收益,您可以尝试一些函数式编程,当您开始理解它时,这是一种了不起的体验,并且可能会使您成为更好的程序员。</ propaganda>
phipsgabler 2012年

3
你是我的上帝,你的宣传是我的日常食物。但是,我尝试将其应用于元组:(train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))似乎不起作用。求求你,从程序编程的迷雾中解救我的灵魂
Monica的革命

@RevolucionforMonica回复有点晚,但这是如何做的Python 3 REPL代码示例:repl.it/@foobar123/ScarceWhimsicalMainframe
Mass Dot Net

11

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

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

您接受参数,永远不要使用它。


天哪,我从事这项工作已经很久了,然后我在1分钟的工作时间内得到了一个可行的答案……顺便说一句,您知道为什么事情会在冒号面前发生吗?
塔里辛2012年

2
因为它们是功能参数
phipsgabler 2012年

3
您也可以尝试使用“ event = None”为其提供默认值,然后该函数可用于绑定和按钮。
Demosthenex 2012年

5

为什么你需要的状态都xy之前的:

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

您的错误消息表示Tk正在使用一个参数调用lambda,而您编写的lambda则不接受任何参数。如果不需要该参数,则只需接受一个即可,不要使用它。(Demosthenex有代码,我会发布它,但遭到殴打。)


感谢您的解释。我想我终于可以解决这个问题了。
塔里森2012年

3

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

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

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

但是lambda中的i将受到名称的约束,因此,

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

与您可能想要的不同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.