lambdas如何运作?

时间:2010-12-09 03:12:29

标签: python lambda

我正在使用官方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中理解匿名函数,但这让我很难过。有人想照亮一些光吗?我很感激。

8 个答案:

答案 0 :(得分:5)

考虑一下。 fmake_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中,(...)中的部分)
  • 要评估的一些表达式(在JavaScript中,{...}中的部分,自动返回)

参数列表是冒号前面的部分。这些参数在表达式的范围内可见。作为函数的结果,返回表达式求值的内容。

与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

这会将34传递给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是整数时,
  1. x 2 具有奇数个因子。

  2. 当x> 1时,
  3. x 2 大于x。

  4. x 2 有衍生物2x。

  5. x 2 具有反函数,即sqrt(x),对于x> 0。

  6. 前两个陈述是关于特定但未指定数字的平方。在那些陈述中,“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 )并返回一个函数。这与正常的函数定义具有相同的结果,除了该函数不会自动接收名称。