当我尝试打印并查看每个函数的功能时,我只能调用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))
答案 0 :(得分:2)
two_to_one = lambda g: (lambda y: g(y,y))
这等于调用函数g
的函数,向它传递两个变量y
。在这种情况下,g
是
lambda x, y: x*y
因为这是在第三行(two_to_one
的作业)传递给h
的参数。
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。
答案 1 :(得分:1)
这是一个令人费解的事情!
所以让我们一点一点地打破逻辑。我们将从h
开始,它基本上是
h = lambda x, y : x*x + y*y
h(3,2) # output is 13
现在,我们将成为优秀的程序员并寻找重复。 x*x
和y*y
基本上是一回事。为什么不让lambda这样做?
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
实际上是您问题中的two_to_one
现在是最后一步。您是否在代码中看到任何其他重复?我们两次调用mul_a
和add_a
两次。因此,为了避免这种情况,我们定义了一个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
因此,我们最终会在您的问题中找到代码
答案 2 :(得分:0)
我希望相对容易理解。
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
(1个参数 - 由于f(x)
),并返回一个函数,它得到两个参数(可能是数字)x,y
并输出{{1} }。
现在,对于13输出 - 从内到外工作:
f(x) + f(y)
h = one_to_two(two_to_one(lambda x, y: x*y))
两个参数输入 - 乘法输出。这是lambda x, y: x*y
的输入所以(记住前面写的内容)two_to_one
是一个获得1个数字的函数,并返回它的平方。最后,将此函数提供给two_to_one(lambda x, y: x*y)
会得到一个函数,该函数得到两个数字(之前为one_to_two
frim)并返回它们的平方和。
总共x,y
代表h(3,2)
。