lambda函数中的lambda如何工作?

时间:2018-01-21 06:51:39

标签: python python-3.x lambda

当我尝试打印并查看每个函数的功能时,我只能调用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))

3 个答案:

答案 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的两次调用之和,传递值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

答案 1 :(得分:1)

这是一个令人费解的事情!

所以让我们一点一点地打破逻辑。我们将从h开始,它基本上是

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

现在,我们将成为优秀的程序员并寻找重复。 x*xy*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_aadd_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)