Python内联for循环与普通for循环求和运行结果差异原因求解
两种写法的核心差异是传入sum()函数的参数类型完全不同
1. 第一种错误写法的问题
sum() 函数的第一个入参要求是 可迭代对象(比如列表、生成器、元组等),它的运行逻辑是遍历这个可迭代对象,把里面的所有元素累加求和。
你写的循环里,每次迭代都把单个float(d['cty'])值传给sum(),比如第一次传的是18.0,第二次传的是21.0,这两个都是独立的float数值,不属于可迭代对象,自然会触发float object is not iterable的报错。
而且就算这个写法不报错,也达不到全局求和的效果:你每次循环都是单独对单个值求和,没有把所有cty的值累加在一起,等价的正确for循环写法应该是:
total = 0 for d in mpg: total += float(d['cty'])
2. 第二种正确写法的逻辑
你写的sum(float(d['cty']) for d in mpg)中,括号内的float(d['cty']) for d in mpg是生成器表达式,本身就是可迭代对象,它会按顺序产出每个字典的cty转换后的float值。sum()直接迭代这个生成器,把所有产出的值累加,完全符合sum()的入参要求,所以可以正常运行。
这种写法本质和下面的列表推导式写法效果一致,只是生成器不需要额外生成完整列表占用内存,效率更高:
sum([float(d['cty']) for d in mpg])
它和你第一种写法完全不是等价实现,自然运行结果不一样。
内容的提问来源于stack exchange,提问作者zlee11
相关产品推荐
相关产品推荐

