[英]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
,并传递值x
和y
。 在这种情况下, f
是two_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。
那真是个大事!
因此,让我们一点一点地打破逻辑。 我们将从h
开始,它本质上是
h = lambda x, y : x*x + y*y
h(3,2) # output is 13
现在,我们将成为优秀的程序员,并寻求重复。 x*x
和y*y
本质上是同一件事。 为什么不这样做呢?
a = lambda x: x*x
h = lambda x,y: a(x) + a(y)
h(3,2)
很好,但是我希望调用者决定执行x*x
还是x**x
或x+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.