无限序列生成器核心是yield、while True和按需取值;最简计数器从0开始递增;增强版等差序列用乘法避免精度误差,自动适配类型,省略end即无限。

用生成器函数生成无限序列,核心就三点:用 yield 返回值、用 while True 保持持续产出、靠 next() 或 for 循环 按需取值。它不占内存、不预计算,真正实现“要一个给一个”。
写一个最简无限计数器
从 0 开始不断加 1 的序列是最典型的例子:
def infinite_counter():
n = 0
while True:
yield n
n += 1
调用后得到一个生成器对象,每次 next() 就推进一次:
gen = infinite_counter() print(next(gen)) # 0 print(next(gen)) # 1 print(next(gen)) # 2
它不会卡住或报错,只要你不手动停,它就能一直产下去。
支持多种起始与步长的等差序列
真实场景中,常需要自定义起点、步长,甚至支持浮点数。直接累加容易累积精度误差,推荐用乘法重构:
- 用
type(begin + step)自动适配数据类型(如 float、Decimal) - 用
begin + step * index替代循环累加,避免浮点漂移 - 省略
end参数即表示无限,逻辑更清晰
def aritprog_gen(begin, step, end=None):
result_type = type(begin + step)
index = 0
while end is None or begin + step * index 例如:list(aritprog_gen(0.1, 0.3, 1.0)) 安全输出 [0.1, 0.4, 0.7],不会出现 0.9999999999999999 这类误差。
组合标准库实现工业级方案
Python 的 itertools.count() 本身就是专为无限等差序列设计的生成器:
-
itertools.count(start=0, step=1)直接返回无限迭代器 - 配合
itertools.takewhile()可按条件截断,无需手写循环逻辑 - 类型安全仍需前置处理,比如先转成目标类型再传入
import itertools <p>def aritprog_v3(begin, step, end=None): first = type(begin + step)(begin) gen = itertools.count(first, step) if end is not None: gen = itertools.takewhile(lambda x: x </p>
这个版本代码短、性能高、可读性强,适合生产环境直接复用。
关键细节别忽略
- 生成器函数首次调用不执行,只返回生成器对象;真正执行从第一次
next()开始 - 每次
yield后函数挂起,保存全部局部变量状态,下次继续从下一行运行 - 无限生成器不能用
list()全展开,否则会卡死或爆内存 - 可用
itertools.islice(gen, 10)安全取前 N 项,比手动for i in range(10): next(gen)更 Pythonic










