我试图弄清楚一行代码的作用,但是我努力理解它是如何工作的。我通常了解Python中lambda表达式的用途,用法和局限性,但是这一行代码使我感到困惑,并且找不到其他解决方法。
我正在尝试为一个计算器创建多个按钮,当按下按钮时,将出现相应的值。我不想使用9个单独的按钮,而是想使用列表理解一次将它们全部制作出来(9个按钮,计算器上每个数字1个)。请参阅代码以获取更多详细信息。
我不太了解x=button_num
在lambda x=button_num: enter_number(x)
表达式中的作用,以及为什么只有这样写时它才起作用。如果我使用表达式lambda: enter_number(button_num)
,则无论我按下哪个按钮,计算器都只会显示值9。
# Function inserts value into calculator based on clicked button
def enter_number(x):
if entry_box.get() == "O": # Used to emulate that a calculator has a "0" initially
entry_box.delete(0, 'end')
entry_box.insert(0, str(x))
else:
length = len(entry_box.get())
entry_box.insert(length, str(x))
# Generate buttons
button_numbers = [Button(width=4, text=str(button_num), font='times 15 bold', bd=5,
command=lambda x=button_num: enter_number(x)) for button_num in range(10)]
答案 0 :(得分:2)
为扩展乔凡尼的答案,其他提议的方法不起作用的原因是lambda: enter_number(button_num)
将使用封闭范围内的button_num
的值(即列表理解)。然后,对于每个后续的lambda,button_num的值都会更改,并以9结尾。通常button_num
可以在此时删除,但是由于lambda依赖于此,它将保留其值9。
但是,默认参数是在函数定义时而不是函数调用时求值的,因此它们不会成为此问题的牺牲品。他是一个写得更清楚的例子
button_num = 0
def command(x=button_num):
print(x)
button_num = 1
command()
在上面的代码中,command()
将打印0,而不是1,因为button_num
的值是在用作默认参数时保存的。
答案 1 :(得分:2)
lambda
与def
非常相似,但没有名称。在这两种情况下,类似x=10
的东西都定义了一个名为x
的参数,其默认值为10
。
例如,考虑此简单功能。
def foo(x=10):
print("x: {}".format(x))
运行时,您将得到以下结果:
foo()
打印“ x:10” foo(42)
=>打印“ x:42” lambda
与def类似(不完全相同,但对于本次讨论而言足够接近),不同之处在于该函数是匿名的-它没有名称。然后,您可以将此函数分配给变量,或将其传递给希望传递函数的对象,例如在定义回调时。
例如,这将创建一个匿名函数并将其与名为foo
的变量关联。然后,您可以像调用其他任何函数一样完全调用它。
foo = lambda x=10: print("x: {}".format(x))
foo() # prints "x: 10"
foo(42) # prints "x: 42"
lambda
是一种在不真正关心函数名称的情况下(例如在创建回调时)创建函数的便捷方法。通过使用默认参数,可以将变量的当前值绑定为给定参数的默认值。
答案 2 :(得分:1)
与普通函数定义一样,您可以为lambda函数的输入设置默认值
foo = lambda x=3: x+5
foo()