如何用Python3单行代码实现列表元素累加和生成器?
单行生成器实现列表元素累加和
方法1:使用海象运算符(Python3.8+,最简洁)
通过海象运算符在生成器表达式内部维护累加状态,直接实现需求:
acc = 0; gen = (acc := acc + num for num in [1, 2, 3, 4])
测试效果:
>>> next(gen) 1 >>> next(gen) 3 >>> next(gen) 6 >>> next(gen) 10
这里用分号将累加变量初始化与生成器定义合并为一行,acc会在每次next()调用时更新,从而保留之前的累加值。
如果不想提前初始化acc,可以把初始化逻辑整合进生成器表达式:
gen = (acc := acc + num for num in [1, 2, 3, 4] if (acc := 0) or True)
if (acc := 0) or True的作用是在生成器启动时将acc设为0,后续因True始终成立,不会过滤任何元素。
方法2:兼容旧版本Python(无海象运算符)
如果你的Python版本低于3.8,可以用可变对象(比如列表)存储累加值——可变对象的修改会在生成器迭代中保留状态:
gen = (sum_list[0] for sum_list in [[0]] for num in [1, 2, 3, 4] if (sum_list[0] := sum_list[0] + num))
这种方式利用了列表的可变性,让累加值在生成器的多次调用中持续更新。
方法3:借助标准库itertools(最简实现)
Python标准库itertools的accumulate函数本身就生成累加序列的迭代器,行为完全符合你的需求,可直接作为生成器使用:
from itertools import accumulate; gen = iter(accumulate([1, 2, 3, 4]))
甚至可以更简洁(accumulate返回的迭代器可直接调用next()):
from itertools import accumulate; gen = accumulate([1, 2, 3, 4])
内容的提问来源于stack exchange,提问作者Xar
相关产品推荐
相关产品推荐

