在python中如何在lambda函数中传递参数?

在python中如何在lambda函数中传递参数?,python,lambda,parameter-passing,Python,Lambda,Parameter Passing,我想设置对象的颜色,但不想为每种颜色创建10个函数。 所以,我只想声明颜色,创建10个按钮和一个函数。错误消息是: <lambda>() missing 1 required positional argument: 'green' 它不需要是lambda函数,问题是,我如何通过单击按钮调用带有参数的printfunction?可调用的命令不带任何参数。如果要将绿色列表传递到打印函数,只需省略参数,lambda不需要它: Btn=Button(text="Trigger lambd

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

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

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

可调用的
命令不带任何参数。如果要将
绿色
列表传递到
打印函数
,只需省略参数,lambda不需要它:

Btn=Button(text="Trigger lambda", command=lambda: printfunction(green))
现在,lambda内部的
绿色
表示全局

如果您只想使用预定义的参数调用
printfunction
,那么可以使用;您将要调用的函数加上需要传入的任何参数传递给它,当它的返回值被调用时,它将完全这样做;使用指定的参数调用函数:

from functools import partial

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

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
默认参数。这是在每次迭代中绑定值所必需的。如果没有它,调用函数时将进行
的查找,这会导致丢失的全局
的错误,或者选择一个碰巧在那里找到的随机值,但不是您想要的值。如果允许创建正确的MemberFunction而不仅仅是StaticFunction,那么使用
functools.partial()
可能会更干净。请注意,文档中提到的示例纯Python实现允许创建MemberFunction,因此使用它作为替换是一个选项。

或者,您可以使用
partial(printfunction,绿色)
@JakubM.:我担心解释
functools.partial()
将是一个概念性的步骤太远了。
functools.partial()
是这项工作的正确工具-没有必要重新设计轮子。我想如果你得到
lambda
,你会得到
partial()
。哦,你们这些家伙,还有你们的手臂
partial()
确实是正确的工具,它比lambda性能更好。当你知道自己在做什么时,这是一个正确的工具,但是当你仍然掌握了可调用项和Tk按钮的概念时,必须学习partials也是一个新的学习者可以不用的额外认知权重。但是,在你的头上-P@Bakuriu:lambdas没有什么特别之处,函数也是如此。当然,分部本身没有作用域名称空间,因此不会受到影响,但您并没有在其中定义函数或lambda。您所看到的是一个关于何时在新范围中查找名称的误解
lambdas.append(lambda x=x:x+1)
将打印
1
然后打印
2
。我找到了一种方法,但对我来说并不完全方便:command=self.start\u set\u color函数,它为每种颜色(2行)调用一个函数,调用第二个通用函数“self.set\u color”(这将颜色作为参数。但仍有多个函数找到了解决方案,类似于第一个想法:lambda:command=lambda:set_color(“绿色”)作为绿色按钮。lambda只需在没有参数的情况下调用。感觉有点愚蠢。(:嗯,我对你的解决方案投了更高的票,因为它既简单又容易,但我不会让即将到来的Pythonista成为另一个相对简单的选项,让你对Python有更多的了解。下一步:重写getitem以动态生成彩色打印方法。嗯,这是一个有趣的想法。在其他一些代码中,我注意到一个奇怪的行为re值是随机选取的,看起来value=value就是实现这一点的方法。
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)