理解 python 中的 lambda 并使用它来传递多个参数
Posted
技术标签:
【中文标题】理解 python 中的 lambda 并使用它来传递多个参数【英文标题】:Understanding lambda in python and using it to pass multiple arguments 【发布时间】:2012-05-07 21:15:26 【问题描述】:在阅读了我在 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 个)
【问题讨论】:
【参考方案1】:为什么需要在
:
之前同时声明x
和y
?
因为它是一个函数定义,它需要知道函数接受哪些参数,以及以什么顺序。它不能只查看表达式并使用其中的变量名称,因为其中一些名称您可能希望使用现有的局部或全局变量值,即使它这样做了,它也不知道它的顺序应该期望得到它们。
您的错误消息意味着 Tk 使用一个参数调用您的 lambda,而您的 lambda 被编写为不接受任何参数。如果您不需要参数,只需接受一个并且不要使用它。 (Demosthenex has the code,我本来会发的,但被打了。)
【讨论】:
感谢您的解释。我想我终于明白了这一点。【参考方案2】:为什么要在 ':' 之前同时声明 'x' 和 'y'?
您实际上可以在某些情况下(当您只有一个参数时)不要将 x 和 y 放在 ":" 之前。
>>> flist = []
>>> for i in range(3):
... flist.append(lambda : i)
但是 lambda 中的 i 将被名称绑定,所以,
>>> flist[0]()
2
>>> flist[2]()
2
>>>
与您可能想要的不同。
【讨论】:
【参考方案3】:为什么要在 ':' 之前同时声明 'x' 和 'y'?
因为 lambda (在概念上)与函数相同,只是内联编写。你的例子相当于
def f(x, y) : return x + y
只是没有将其绑定到像 f
这样的名称。
还有如何让它返回多个参数?
就像函数一样。最好返回一个元组:
lambda x, y: (x+y, x-y)
或者一个列表,或者一个类,或者其他什么。
self.entry_1.bind
的东西应该由Demosthenex回答。
【讨论】:
要真正从它们中学到最少,您可能会尝试一些函数式编程,当您开始理解它时,这是一种很棒的体验,并且可能会让您成为更好的程序员。 你是我的上帝,你的宣传是我的日常面包。然而,我尝试将它应用于一个元组:(train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))
,它似乎不起作用。请从程序编程的迷雾中拯救我的灵魂
@RevolucionforMonica 回复有点晚,但这里有一个 Python 3 REPL 代码示例,说明如何做到这一点:repl.it/@foobar123/ScarceWhimsicalMainframe【参考方案4】:
我相信 bind 总是试图发送一个事件参数。试试:
self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))
您接受该参数并且从不使用它。
【讨论】:
omg,我一直在研究这个问题,然后我在 1 分钟内得到了一个有效的答案......顺便说一句,你知道为什么事情会出现在冒号前面吗?跨度> 因为它们是函数参数。 你也可以试试“event=None”给它一个默认值,然后这个函数就可以用于绑定和按钮了。以上是关于理解 python 中的 lambda 并使用它来传递多个参数的主要内容,如果未能解决你的问题,请参考以下文章
lambda 函数中的 python 和 python-jose 错误