Python考试Lambda表达式求值问题:输出为何为6?
复杂Lambda表达式求值推导
我们直接拆解题目中的代码:(lambda x:x((lambda x:x(lambda x:x))(x(x))))(lambda x:x)(lambda x:x+x)(3),用变量替换+分步计算的方式理清逻辑:
步骤1:给各Lambda命名(避免命名冲突)
- 恒等函数:
B = lambda x:x(第一个传入的参数) - 加法函数:
F = lambda x:x+x(第二个传入的参数) - 中间Lambda:
D = lambda x:x(lambda x:x) - 最外层Lambda:
A = lambda x:x(D(x(x)))
整个表达式等价于:((A(B))(F))(3),我们从左到右逐步计算。
步骤2:计算A(B)
把x=B代入Lambda A:
- 先算
x(x):B(B),因为B是恒等函数(输入什么返回什么),所以B(B)=B。 - 再算
D(x(x))即D(B):把x=B代入D,得到B(lambda x:x),还是因为B是恒等函数,返回传入的lambda x:x,记这个结果为E = lambda x:x。 - 最后算
x(D(x(x)))即B(E):B(E)=E(恒等函数特性),所以A(B)=E(也就是恒等函数)。
步骤3:计算(A(B))(F)即E(F)
E是恒等函数,所以E(F)=F(直接返回传入的加法函数)。
步骤4:计算(E(F))(3)即F(3)
F是lambda x:x+x,代入x=3,得到3+3=6。
可视化简化流程
((A(B))(F))(3) → ((B(D(B(B))))(F))(3) → ((B(D(B)))(F))(3) → ((B(lambda x:x))(F))(3) → ((lambda x:x)(F))(3) → (F)(3) → 3+3=6
内容的提问来源于stack exchange,提问作者appleraincoat
相关产品推荐
相关产品推荐

