如何“兰巴变量=变量:somefunction()”工作? (实施例包含)(How does &

2019-09-30 00:40发布

我正在寻找的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 ,以及对我的爱,我想不通为什么。 它有什么作用?

Answer 1:

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

f = lambda x: 2*x

是(或多或少),相当于

def f(x):
    return 2*x

另外,对于正常功能,也可以有默认参数也处于lambda功能。 从而

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

可以被称为或者作为f() ,其中x将是的值k2f(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是一个全球性的(外)对象。

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

因此,推迟到执行我们总结的执行openApp(Apps[app])中的功能。 选择菜单项时将被执行此功能。 因此,我们将调用openApp然后,而不是现在 (当时我们想添加的命令),这将是情况并非如此。

现在,由于lambda函数调用不带参数,它将使用默认参数(外) app为(内部) app 。 这使得整个参数有些多余,作为外变量是内直接访问lambda表达。 因此,能够简化表达式lambda: openApp(Apps[app])即没有室内用参数,使得整行

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

对我来说,这看起来有点简单,是我写的方式,但在概念上有这一点,并使用默认参数的代码没有什么区别。



文章来源: How does 'lamba variable=variable: somefunction()' work? (Example included)