在lambda表达式中使用“ =”运算符是什么意思?

时间:2019-09-03 15:24:49

标签: python-3.x function tkinter lambda functional-programming

我试图弄清楚一行代码的作用,但是我努力理解它是如何工作的。我通常了解Python中lambda表达式的用途,用法和局限性,但是这一行代码使我感到困惑,并且找不到其他解决方法。

我正在尝试为一个计算器创建多个按钮,当按下按钮时,将出现相应的值。我不想使用9个单独的按钮,而是想使用列表理解一次将它们全部制作出来(9个按钮,计算器上每个数字1个)。请参阅代码以获取更多详细信息。

我不太了解x=button_numlambda 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)]

3 个答案:

答案 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)

lambdadef非常相似,但没有名称。在这两种情况下,类似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()