有人可以解释一下吗?我了解它们背后的基本概念,但我经常看到它们可以互换使用,我感到困惑。
既然我们在这里,它们与常规函数有何不同?
lambda 只是一个匿名函数 - 一个没有名称定义的函数。在某些语言中,例如 Scheme,它们等价于命名函数。实际上,函数定义被重写为在内部将 lambda 绑定到变量。在其他语言中,例如 Python,它们之间存在一些(相当不必要的)区别,但它们的行为方式相同。
闭包* 是在定义它的 环境中 关闭 的任何函数。这意味着它可以访问不在其参数列表中的变量。例子: *
def func(): return h def anotherfunc(h): return func()
这将导致错误,因为func未 关闭anotherfunc在-h未定义的环境中。func仅在全球环境中关闭。这将起作用:
func
anotherfunc
h
def anotherfunc(h): def func(): return h return func()
因为在这里,func在anotherfunc, 和 python 2.3 及更高版本(或类似的数字)中定义,当它们 几乎 得到正确的闭包时(突变仍然不起作用),这意味着它 关闭了 anotherfunc‘s 环境并可以访问内部的变量它。在 Python 3.1+ 中,突变在使用关键字nonlocal时也有效。
nonlocal
另一个重要的一点 -func将继续关闭 overanotherfunc的环境,即使它不再在anotherfunc. 此代码也将起作用:
def anotherfunc(h): def func(): return h return func print anotherfunc(10)()
这将打印 10。
正如您所注意到的,这与lambda s无关——它们是两个不同(尽管相关)的概念。