Python中如何以Pythonic方式将lambda列表合并为单个函数
Pythonic实现lambda列表合并为单嵌套调用函数
需求本质是做顺序函数复合:按列表内lambda的排列顺序,把前一个函数的输出作为后一个函数的输入,最终得到一个接收初始参数x、返回链式调用结果的独立函数,不需要手动逐层写嵌套调用。
最符合Python风格的实现直接用标准库的functools.reduce即可,不需要写冗余的循环或者嵌套逻辑,不管列表里有多少个lambda都能自动适配。
from functools import reduce lambdas = [lambda x, k=k: x+k for k in range(3)] f = lambda x: reduce(lambda val, func: func(val), lambdas, x)
逻辑说明
reduce会按顺序遍历列表里的每一个lambda:
- 初始值为传入的参数x,先传给列表第一个lambda计算
- 把上一步的计算结果传给下一个lambda
- 遍历完所有lambda后返回最终结果
这个逻辑和手动写的嵌套调用lambda x: lambdas[2](lambdas[1](lambdas[0](x)))完全一致,测试验证:
print(f(0)) # 输出3,计算过程0+0+1+2=3 print(f(1)) # 输出4,计算过程1+0+1+2=4
补充提示
示例里的lambda写k=k是必要操作,通过默认参数固定了循环每一轮的k值,可以避开Python闭包晚绑定的常见坑——如果去掉这个默认参数,所有lambda都会引用循环结束时的k=2,计算结果就不符合预期。
内容的提问来源于stack exchange,提问作者apocalypsis
相关产品推荐
相关产品推荐

