如何使用lambda与list comprehension正确改写Python循环
问题重述
需要使用lambda和列表推导式重写以下计算自然常数e近似值的循环代码:
n = 17 e = 0 for i in range(0, n): e += 1 / factorial(i) print(e)
原有尝试代码无法运行,错误代码如下:
lst = [item for item in map(lambda e: e + 1/factorial(i), range(0,n))]) myMap = map(lambda e: e + 1/factorial(i), range(0,n))
原有代码问题
- 变量引用错误:定义的lambda接收参数
e,但函数体内使用了从未被赋值的变量i,运行会直接抛出NameError - 累加逻辑错误:
map仅对迭代器内的元素做逐元素独立映射,不会保留上一轮的计算结果,无法实现原循环里的累加效果 - 依赖缺失:Python没有全局内置
factorial阶乘函数,该函数在标准库math模块中,未导入就调用会报名称错误
正确实现方案
核心逻辑拆分:用lambda定义单一项的计算规则,通过列表推导式生成所有待累加的项,最后用sum()函数完成统一累加,和原循环逻辑完全等价。
import math n = 17 # lambda定义单步计算逻辑:传入索引i,返回对应项1/i! calc_single = lambda i: 1 / math.factorial(i) # 列表推导生成所有项后求和 e = sum([calc_single(i) for i in range(n)]) print(e)
运行后得到的结果和原循环完全一致,约为2.7182818284590455。
注:如果要兼容之前尝试的map写法,也可以按如下方式实现,但不符合列表推导式优先的要求:
import math n = 17 e = sum(map(lambda i: 1/math.factorial(i), range(n))) print(e)
内容的提问来源于stack exchange,提问作者Aleks
相关产品推荐
相关产品推荐

