嵌套Lambda函数工作原理、调用问题及代码输出13的原因咨询
嵌套Lambda函数的工作机制与代码执行解析
一、嵌套Lambda的工作机制
嵌套Lambda其实就是高阶函数+闭包的组合玩法:
- 外层Lambda是个高阶函数——它的参数是函数,返回值也是另一个Lambda(函数)。比如
two_to_one和one_to_two都是这类角色,它们本身不直接执行计算,而是“生成”一个新的函数。 - 内层Lambda会捕获外层Lambda传入的参数(这里是函数类型的参数),形成闭包。只有当外层Lambda被调用、返回内层Lambda之后,这个内层Lambda才是一个可以接收具体参数执行计算的“可用函数”。
你说打印其他函数只返回函数对象?这太正常了:
two_to_one是个高阶函数,你没给它传参数的话,它就是个“等待接收函数、生成新函数”的模板,所以打印它只会显示<function ...>;- 只有当你给
two_to_one传入一个二元函数(比如那个乘法Lambda),它才会返回一个能计算平方的一元函数; - 同理
one_to_two也是一样,得传入一个一元函数,才会返回一个能计算两个数平方和的二元函数; - 而
h是经过两次高阶函数调用后得到的最终可执行函数,所以你调用h(3,2)能得到结果,其实直接打印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))
咱们从里到外、从上到下一步步走:
最内层的乘法Lambda:
lambda x, y: x*y,这就是个普通的二元函数,输入两个数返回乘积,咱们叫它mul,也就是mul(x,y) = x*y。调用
two_to_one(mul):two_to_one的作用是“把一个二元函数转成一元函数”——它接收二元函数g=mul,返回的内层Lambda是lambda y: g(y,y)。这个内层函数接收一个参数y,会调用mul(y,y),也就是计算y*y(平方)。咱们把这个返回的函数叫square,即square(y) = y²。调用
one_to_two(square):one_to_two的作用是“把一个一元函数转成二元函数”——它接收一元函数f=square,返回的内层Lambda是lambda x, y: f(x) + f(y)。这个内层函数接收两个参数x和y,分别计算square(x)和square(y)再相加,也就是x² + y²。这个函数就是咱们最终的h。调用
h(3,2):
代入参数就是3² + 2² = 9 + 4 = 13,所以最终打印输出13。
内容的提问来源于stack exchange,提问作者Tomer Hochbaum
相关产品推荐
相关产品推荐

