如何在Lambda中阅读或解释Lambda

时间:2018-10-01 17:22:59

标签: python lambda

我试图了解嵌套的lambda:

f = lambda x, y: y(y(x))
g = lambda x : lambda y: x(y)
print( f(lambda x: x+1, g) (4) )

有人告诉我该代码印有“ 5”。该如何解释?如何在最后一行中解析(4)

根据我对lambda的理解,

h = lambda a, b : a+b

我知道print(h(1,2))会给3 为a = 1,b = 2,然后进行a + b = 1 + 2 = 3

3 个答案:

答案 0 :(得分:5)

f(lambda x: x+1, g)最终返回另一个函数。然后以4作为参数调用那个函数,以产生5的最终结果。


h = lambda x: x + 1,因为否则将变得一团糟。

首先,我们将f应用于hg

f(h, g)(4) == (lambda x,y: y(y(x))(h, g)(4)
           == g(g(h))(4)

接下来,我们将评估对g的内部调用:

g(g(h))(4) == g((lambda x: lambda y: x(y))(h))(4)
           == g(lambda y: h(y))(4)
           == g(h)(4)

最后一步是 eta简化的示例,使用来自lambda演算的术语:将第二个函数应用于参数的函数等同于第二个函数本身。

最后,我们以相同的方式再次评估g(h),最终使我们得到一个不涉及将函数作为参数传递的表达式,并让我们得到最终答案。

g(h)(4) == (lambda y: h(y))(4)
        == h(4)
        == (lambda x: x + 1)(4)
        == 4 + 1
        == 5

答案 1 :(得分:0)

让我们努力扩展逻辑。首先,我将重命名一些参数名称以区分您的两个函数:

f = lambda i, j: j(j(i))
g = lambda x: lambda y: x(y)

现在f(lambda x: x+1, g)等效于:

h = (lambda i, j: j(j(i)))(lambda x: x+1, g)

在这里,一个函数被用作参数。很好,因为函数是Python中的一流对象,并且可以通过这种方式传递。因此,对此进行评估:

h = g(g(lambda x: x+1))

但是g没什么花哨的,它只需要一个函数并将其应用于参数。可以将其视为以函数作为参数的“身份”函数。您可以完全摆脱g。所以我们有:

h = (lambda x: x+1)

换句话说,h只会在任何输入中添加一个。

答案 2 :(得分:0)

h = lambda x: x+1是一个比返回的值多返回1的函数。
相当于:

def h(x):
    return x+1


f = lambda x, y: y(y(x))是一个函数,该函数将一个值和一个函数作为一对参数并评估function(function(value))。
等效于:

def f(x, y):
    return y(y(x))


g = lambda x: lambda y: x(y)是修饰器函数,它根据传递给它的函数返回一个新函数。

它等效于:

def g(x):
    def new_func(y):
        return x(y)
    return new_func



给定的lambda表达式

f = lambda x, y: y(y(x))
g = lambda x : lambda y: x(y)


要评估的表达式

   f(lambda x: x+1, g) (4)

这减少到

=> g(g(lambda x: x+1)) (4)

现在请注意,g(g(lambda x:x + 1))返回函数g(lambda x:x + 1)

=> g(lambda x: x+1) (4)

现在,这里g(lambda x:x + 1)再次返回一个函数(x + 1)

=> (x+1) (4)

这等于4 + 1,即5

=> 5