【问题标题】:How does 'lamba variable=variable: somefunction()' work? (Example included)'lamba variable=variable: somefunction()' 是如何工作的? (包括示例)
【发布时间】:2018-09-11 05:13:44
【问题描述】:

当我偶然发现this 用户提交的解决方案(针对其他人的问题)时,我正在 StackOverflow 中寻找我的问题的解决方案:

appsMenu.add_command(label=app, command=openApp(Apps[app]))

调用函数的命令参数需要包裹在lambda中,以防止它们被立即调用。此外,在 for 循环中绑定的命令需要循环变量作为默认参数,以便每次都绑定正确的值。

 appsMenu.add_command(label=app, command=lambda app=app: openApp(Apps[app]))

如你所见,用户写了lambda app=app,看在我的份上,我不知道为什么。它有什么作用?

【问题讨论】:

标签: python python-3.x lambda command


【解决方案1】:

lambda 表达式用于定义单行(匿名)函数。因此,写作

f = lambda x: 2*x

(或多或少)等价于

def f(x):
    return 2*x

此外,对于普通函数,lambda 函数中也可以有默认参数。因此

k = 2
f = lambda x=k: 2*x

可以称为f(),其中x 将是k 的值,即2f(3),其中x = 3。现在,更奇怪的是,由于lambda 函数有自己的命名空间,所以可以将kx 交换为

x = 2
f = lambda x=x: 2*x

这意味着如果没有设置其他参数,f() 的默认值将是(外部)x 值(即2)。

因此,表达式

lambda app=app: openApp(Apps[app])

是一个函数(未命名),它接受一个参数app 和(外部)变量app 的默认值。当被调用时,它将执行指令openApp(Apps[app]),其中Apps 是一个全局(外部)对象。

现在,我们为什么要这样,而不是在调用 .add_command() 时只写 command=openApp(Apps[app])?原因是我们希望命令不是在定义命令时执行,即在调用.add_command()时,而是在稍后的时间,即在选择菜单项时。

因此,为了推迟执行,我们包装在函数中执行openApp(Apps[app])。然后选择菜单项时将执行此功能。因此,我们将调用openApp,而不是现在(在我们想要添加命令的时候),否则会出现这种情况。

现在,由于 lambda 函数在没有参数的情况下被调用,它将使用其默认参数(外部)app 作为(内部)app。这使得整个参数有点多余,因为外部变量可以在 lambda 表达式中直接访问。因此,可以将表达式简化为lambda: openApp(Apps[app]),即没有参数,使整行

appsMenu.add_command(label=app, command=lambda: openApp(Apps[app]))

对我来说,这看起来有点简单,也是我编写它的方式,但从概念上讲,这与带有默认参数的代码没有区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多