Python 如何在Lambda中阅读或解释Lambda
我试图理解嵌套的lambda:Python 如何在Lambda中阅读或解释Lambda,python,lambda,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=3f(λx:x+1,g)最终返回另一个函数。然后用4
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=3f(λx:x+1,g)
最终返回另一个函数。然后用4作为参数调用该函数,以生成5的最终结果
让
h=lambda x:x+1
,因为这将成为一个混乱的跟踪
首先,我们将f
应用于h
和g
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
让我们试着扩展逻辑。首先,我将重命名一些参数名称以区分两个函数:
f = lambda i, j: j(j(i))
g = lambda x: lambda y: x(y)
现在f(λx:x+1,g)
相当于:
h = (lambda i, j: j(j(i)))(lambda x: x+1, g)
def h(x):
return x+1
def f(x, y):
return y(y(x))
def g(x):
def new_func(y):
return x(y)
return new_func
这里是一个用作参数的函数。这很好,因为函数是Python中的一流对象,可以通过这种方式传递。因此,评估这一点:
h = g(g(lambda x: x+1))
但是g
一点也不奇怪,它只是取一个函数并将其应用于一个参数。它可以被视为一个“同一”函数,函数作为参数。你可以完全摆脱g
。因此,我们:
h = (lambda x: x+1)
换句话说,
h
只是将一个值添加到任何输入。h=lambda x:x+1
是一个比传递给它的值多返回1的函数它相当于:
h = (lambda i, j: j(j(i)))(lambda x: x+1, g)
def h(x):
return x+1
def f(x, y):
return y(y(x))
def g(x):
def new_func(y):
return x(y)
return new_func
f=lambda x,y:y(y(x))
是一个函数,它将值和函数作为一对参数,并计算函数(函数(值))这相当于:
h = (lambda i, j: j(j(i)))(lambda x: x+1, g)
def h(x):
return x+1
def f(x, y):
return y(y(x))
def g(x):
def new_func(y):
return x(y)
return new_func
g=lambda x:lambda y:x(y)
是一个装饰函数,根据传递给它的函数返回一个新函数。它相当于:
h = (lambda i, j: j(j(i)))(lambda x: x+1, g)
def h(x):
return x+1
def f(x, y):
return y(y(x))
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(λx:x+1)再次返回一个函数(x+1)
计算结果为4+1,即5
=> 5
是否有可能进行逐步分析?我还是个新手,所以这让meDone很困惑:)这已经够棘手了,我想得到TL;在进行精确评估之前,先升级DR版本。Python2用于提供
g
的未编译版本;它被称为apply
:apply(f,x)=f(x)
。我认为g
是一条红鲱鱼,它只是一个身份函数(在高阶函数空间中),不是吗?x
被限制为beta抽象,所以它只是一根头发,而不是身份函数。但是,是的,非常接近。问得好!!