繁体   English   中英

lambda函数内部的lambda如何工作?

[英]How does lambda inside lambda function work?

当我尝试打印并查看每个函数的功能时,我只能调用h函数。 所有其他返回函数。

另外,有人可以告诉我为什么此代码显示13以及发生了什么吗?

two_to_one = lambda g: (lambda y: g(y,y))`
one_to_two = lambda f: (lambda x, y: f(x) + f(y))
h = one_to_two(two_to_one(lambda x, y: x*y))
print(h(3,2))
two_to_one = lambda g: (lambda y: g(y,y))

这等于一个函数,该函数调用函数g ,并向其传递两个变量y 在这种情况下, g

lambda x, y: x*y

因为那是在第三行( h的赋值)传递给two_to_one的参数。


one_to_two = lambda f: (lambda x, y: f(x) + f(y))

这等于一个函数,它将两个调用的总和返回给函数f ,并传递值xy 在这种情况下, ftwo_to_one函数。


分解:

first = lambda x, y: x*y
second = lambda y: first(y,y)
third = lambda x, y: second(x) + second(y)

简化为:

second = lambda y: y * y
third = lambda x, y: second(x) + second(y)

简化为:

third = lambda x, y: x * x + y * y

因此,代码正在执行的操作是返回参数平方的和。 在这种情况下,它们是3和2。

3 * 3 + 2 * 2 = 13

9 + 4 = 13

那真是个大事!

因此,让我们一点一点地打破逻辑。 我们将从h开始,它本质上是

 h = lambda x, y : x*x + y*y
 h(3,2) # output is 13

现在,我们将成为优秀的程序员,并寻求重复。 x*xy*y本质上是同一件事。 为什么不这样做呢?

 a = lambda x: x*x
 h = lambda x,y: a(x) + a(y)
 h(3,2)

很好,但是我希望调用者决定执行x*x还是x**xx+x 每当我这么做时,我都不想改变a 因此,我将lambda传递给a我想要执行的任何操作

# a is just a delegator now. It just calls the lambda that it is "initialized" with passing the values twice
a = lambda lambdaIAmPassing: (lambda someValue: lambdaIAmPassing(someValue, someValue))
# lets pass a multiplication lambda
mul_a = a(lambda x,y: x*y)
# lets pass a addition doing lambda
add_a = a(lambda x,y: x+y)
h = mul_a(3) + mul_a(2)
print h #output is 13
h = add_a(3) + add_a(2)
print h # output is 10

这清楚吗? 您现在已经意识到, a实际上是您问题中的lambda two_to_one

现在是最后一步。您在代码中看到其他重复了吗? 我们呼吁mul_a两次, add_a两次。 因此,为避免这种情况,我们定义了一个lambda,该lambda调用两次传递给它的函数-每个参数一次-并将值相加

# Lambda that adds up the result of the function call
lambda_adder = lambda f: (lambda value1, value2: f(value1) + f(value2))
"Initialize" this lambda with mul_a
h = lambda_adder(mul_a)
h(3,2) # output is 13

因此,我们最终得到您问题中的代码

我希望它相对容易遵循。

two_to_one = lambda g: (lambda y: g(y,y))

two_to_one是一个函数,带有一个函数的输入( g :一个带有两个参数输入的函数(如g(y,y) ))和一个函数的输出(带有1个输入y ,以及g(y,y) )。意味着它是函数的函数,因此当给two_to_one一个二参数函数g ,您将得到一个函数,该函数取1个数字并输出g(y,y) ,例如:

two_to_one(lambda x,y:x+y)(3)
6

我们给two_to_one一个函数,该函数获取两个数字并输出它们的和, lambda x,y:x+y ,然后我们返回一个函数,该函数接收1个数字并输出其自身的和two_to_one(lambda x,y:x+y) 因此,输入3时输出6

第二行类似:

one_to_two = lambda f: (lambda x, y: f(x) + f(y))

取一个函数f (由于f(x)而有1个参数),然后返回一个函数,该函数获得两个参数(可能是数字) x,y并输出f(x) + f(y)

现在,对于13个输出-从内部到外部工作:

h = one_to_two(two_to_one(lambda x, y: x*y))

lambda x, y: x*y两个参数输入-乘法输出。 这是two_to_one的输入,因此(记住前面写过的内容) two_to_one(lambda x, y: x*y)是一个获得1个数字并返回平方的函数。 最后,将此函数提供给one_to_two将提供一个函数,该函数获取两个数字(之前的x,y边沿),然后返回其平方和。

总计h(3,2)给出3**2+2**2=13

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM