【问题标题】:How to pass a parameter in a lambda function in python?如何在python中的lambda函数中传递参数?
【发布时间】:2013-05-19 19:52:20
【问题描述】:

我想设置一个对象的颜色,不想为每种颜色创建 10 个函数。 所以,我只想声明颜色并创建 10 个按钮和一个功能。错误信息是:

<lambda>() missing 1 required positional argument: 'green'

代码:

from tkinter import *

green=["#5bd575","#55c76d"]
#different colors should follow here

root=Tk()
Btn=Button(text="Trigger lambda", command=lambda green: printfunction(green))
Btn.pack()

def printfunction(colorset):
    print(colorset)

它不需要是 lambda 函数,问题只是,如何通过单击按钮调用带有参数的 printfunction

【问题讨论】:

  • 我找到了一种方法,但它对我来说并不完全方便:command=self.start_set_color 函数,它为每种颜色(2 行)调用一个函数,该函数调用第二个通用函数“self. set_color"(获取颜色作为参数。但仍然不止一个函数
  • 找到了一个解决方案,类似于 lambda 的第一个想法:command=lambda:set_color("green") 用于绿色按钮。只需在没有参数的情况下调用 lambda。感觉有点傻。

标签: python lambda parameter-passing


【解决方案1】:

command 可调用对象不接受 任何 参数。如果您想将green 列表传递给printfunction,只需省略参数,lambda 不需要它:

Btn=Button(text="Trigger lambda", command=lambda: printfunction(green))

现在 lambda 中的 green 指的是全局。

如果您只想使用预定义的参数调用printfunction,您可以使用functools.partial() function;您将要调用的函数以及需要传入的任何参数传递给它,当它的返回值被调用时,它就会这样做;使用您指定的参数调用函数:

from functools import partial

Btn=Button(text="Trigger lambda", command=partial(printfunction, green))

【讨论】:

  • 或者,您可以使用partial(printfunction, green)
  • @JakubM.:我担心解释functools.partial() 会是一个概念性的步骤。
  • functools.partial() 是适合这里工作的工具 - 没有必要重新发明轮子。我想如果你得到lambda,你就会得到partial()
  • 哦,你们和你们的手臂在扭动。 partial() 确实是正确的工具,它比 lambda 性能更高。当您知道自己在做什么时,它是正确的工具,但是当您仍然掌握可调用对象和 Tk 按钮的概念时,也必须了解部分内容是新学习者可以做到的额外认知权重。但是,在你的头上。 :-P
  • @Bakuriu:lambdas 没什么特别的,函数也一样。部分本身没有作用域命名空间,因此不会受到影响,当然,但您没有在那里定义函数或 lambda。您看到的是对查找新范围中的名称时的误解。 lambdas.append(lambda x=x: x+1) 将打印1 然后2
【解决方案2】:

Python 非常动态,您可以在定义类后修改类或创建本地函数。示例:

class X:
    # generic print function
    def print_color(self, color):
        pass

# dictionary with colors to support
COLORS = {'green': ["#5bd575","#55c76d"]}

# attach various print functions to class X
for name, value in COLORS.items():
    def print_color_x(self, value=value):
        self.print_color(value)
    setattr(X, 'print_color_{}'.format(name), print_color_x)

注意value=value 默认参数。这是在每次迭代中绑定值所必需的。没有它,value 的查找将在函数被调用时发生,给你一个关于缺少全局 value 的错误,或者选择一个它碰巧在那里找到的随机一个,但不是你想要的那个。使用functools.partial() 可能会更干净,如果它允许创建适当的成员函数而不仅仅是静态函数。请注意,文档中提到的示例纯 Python 实现允许创建成员函数,因此可以选择使用它作为替代。

【讨论】:

  • ( :好吧,我赞成您的解决方案,因为它简单易用,但我不会放弃即将推出的 Pythonista 另一个相对简单的选项,您可以在其中了解更多有关 Python 的信息。下一步:覆盖 getitem 动态生成彩色打印方法。
  • hm 有趣的想法。在其他一些和平的代码中,我注意到随机选择值的奇怪行为,看起来 value=value 是去那里的方法。
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 2022-01-04
  • 2019-08-25
  • 2013-03-29
  • 2017-12-25
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多