You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

嵌套Lambda函数执行逻辑及输出120的原理咨询

嵌套Lambda函数执行逻辑及输出120的原理咨询

嘿,我来帮你把这段绕人的嵌套Lambda代码拆解开,搞清楚它为啥输出120,还有你疑惑的参数传递问题~

首先先看combinator函数的定义:

def combinator(y):
  return (lambda x: lambda y: x(y))(lambda x:y)

我们先拆解这个函数的返回值部分:

  • 首先,(lambda x: lambda y: x(y))是一个高阶函数:它接受一个参数x,然后返回另一个Lambda函数lambda y: x(y)(这个返回的Lambda会接受参数y,并调用x(y))。
  • 紧接着这个高阶函数被传入了参数lambda x:y——注意这里的y是外层combinator函数的参数,是个闭包变量,会跟着combinator的调用被绑定。

所以当combinator(y)被调用时,它返回的其实是:lambda new_y: (lambda x: y)(new_y)。这里的new_y是这个返回Lambda的参数,而里面的lambda x: y不管传入什么x(也就是这里的new_y),都会直接返回闭包捕获的y(也就是combinator的参数)。

接下来看调用链:combinator(lambda x: x*10)(11)(12),我们分三步拆解:

  1. 第一步:调用combinator(lambda x: x*10)
    此时combinator的参数y被绑定为lambda x: x*10(就是那个把输入乘10的函数)。按照上面的拆解,combinator返回的是一个Lambda函数——这个Lambda不管你传什么参数,都会返回lambda x:x*10

  2. 第二步:调用返回的Lambda并传入11
    也就是执行(返回的Lambda)(11),根据上面的结论,这一步的结果就是lambda x:x*10(因为里面的lambda x:y会忽略传入的11,直接返回闭包里的那个乘10函数)。

  3. 第三步:调用这个乘10的函数并传入12
    也就是执行(lambda x:x*10)(12),计算得12*10=120,这就是最终的输出啦!

再解答你关于x(y)的疑问:
你看到的x(y)是在lambda y: x(y)里的,这里的x是外层高阶函数的参数,当我们把lambda x:y传给那个高阶函数时,x就被绑定成了这个Lambda。不过在实际执行中,这个x(y)其实并没有真正用传入的y做计算——因为lambda x:y的逻辑是不管传入什么x,都返回闭包的y,所以这里的x(y)只是触发了这个Lambda的执行,最终拿到的是闭包里的那个函数。

备注:内容来源于stack exchange,提问作者Jeff Beh

火山引擎 最新活动