我正在使用官方python网站上的教程学习python并遇到this example:
>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
x
从哪里获取它的价值?我不熟悉lambda是如何工作的,我从javascript中理解匿名函数,但这让我很难过。有人想照亮一些光吗?我很感激。
答案 0 :(得分:5)
考虑一下。 f
是make_incrementor
函数创建的对象。
这是一个lambda,一个“匿名函数”。
>>> f= lambda x: x+42
>>> f(10)
52
当我们将x
应用于某个值时,f
的值就出现了。
答案 1 :(得分:4)
首先,这是JavaScript的翻译:
function makeIncrementor(n) {
return function (x) {return x + n}
}
lambda表达式由三部分组成。
lambda
(在JavaScript中,单词function
)(...)
中的部分){...}
中的部分,自动返回)参数列表是冒号前面的部分。这些参数在表达式的范围内可见。作为函数的结果,返回表达式求值的内容。
与JavaScript不同,lambda只能包含一个表达式;你不能用lambda创建一个匿名的多行函数。
答案 2 :(得分:1)
免责声明:我几乎没有Python背景。这取决于我的Scheme / lambda演算知识。
make_incrementor定义了一个函数来创建函数。 make_incrementor(42)返回一个函数,其中x绑定到lambda,n返回值为42.当调用函数f时,f的参数替换绑定变量。
答案 3 :(得分:1)
lambda
为Python带来了一些lambda calculus。从本质上讲,这就是正在发生的事情:通常在lambda演算中,语句看起来像这样:
sum = add 3 4
这会将3
和4
传递给add
函数,并将结果存储在sum
中。但是,我们也可以写一些add 3
的内容。现在,由于add
需要两个参数,我们现在得到一个对象(或函数,如果你愿意的话)期望一个参数。然后,该函数将调用add
,其中3为第一个参数,无论我们将其作为第二个参数传递给它。我们现在可以这样做:
func = add 3
sum = func 4
这与前面的例子相同。但是,您现在可以在需要添加3时使用func
。 (当然,这在这个例子中似乎没用,但在更复杂的情况下它是。)
这一切与currying密切相关,这是大多数functional languages中非常重要的内容。如果您对lambda演算及其与常规数学的相似性感兴趣,我强烈建议您查看Haskell。
答案 4 :(得分:1)
当调用make_incrementor()
时,它会创建并返回lambda
函数。在此过程中,参数n
的值将在创建的函数对象中存储或记住。如果您使用不同的n
再次调用它,则会返回不同的函数。
答案 5 :(得分:1)
x
从用于调用f
的参数中获取其值。
n
从用于调用make_incrementor
的参数中获取其值。
答案 6 :(得分:0)
make_incrementor是一个返回函数的函数:
def make_incrementor(n):
return lambda x: x + n
当我们调用make_incrementor时,我们将参数42绑定到n,并返回具体函数:
f = make_incrementor(42) # fill in n at this point and return a function
我们将返回的这个函数如下:
lambda(x): x + 42
f绑定到返回的函数,因此f在概念上看起来像:
def f(x):
return x + 42
当我们调用f时,我们提供x
的值f(1) # x == 1
f(2) # x == 2
答案 7 :(得分:0)
以下是我对lambda的理解:
当我们写x 2 时,我们常常混淆两个不同的想法。考虑:
x 2 具有奇数个因子。
x 2 大于x。
x 2 有衍生物2x。
x 2 具有反函数,即sqrt(x),对于x> 0。
前两个陈述是关于特定但未指定数字的平方。在那些陈述中,“x”代表任意单一的东西,而x 2 代表一个相关的东西。
第三和第四个陈述是关于x 2 的函数。但除了上下文和对微积分的共同理解之外,这在第3和第4章中并未明确传达。我们需要一个符号设备来区分x 2 单个(但是任意)值,x 2 函数。设备还需要通知它是x 的函数。因此发明了lambda:
“lambda x.x 2 ”用于区分并传达“x的函数,其x值为x 2 ”。 lambda运算符采用名称(x)和表达式(x 2 )并返回一个函数。这与正常的函数定义具有相同的结果,除了该函数不会自动接收名称。