生成器是实现斐波那契数列迭代器最自然轻量的方式,用yield自动封装迭代器协议,无需手动实现__iter__和__next__;支持无限序列与限定项数两种写法,比手写迭代器类更简洁安全。

生成器是实现斐波那契数列迭代器最自然、最轻量的方式——它本质就是一个符合迭代器协议的惰性对象,无需手动写 __iter__ 和 __next__,Python 自动帮你封装好了。
生成器函数写法(推荐)
用 yield 定义函数,每次产出一个数,状态自动保存:
- 定义时只需维护两个变量 a 和 b,分别代表当前项和下一项
- yield a 返回当前值,然后执行 a, b = b, a + b 更新状态
- 循环控制交给调用方(比如用 for 或 next()),灵活性高
示例代码:
def fibonacci():a, b = 0, 1
while True:
yield a
a, b = b, a + b
# 获取前 15 个数
fib = fibonacci()
for _ in range(15):
print(next(fib), end=' ')
# 输出:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
带数量限制的生成器(实用场景)
如果明确只要前 n 项,可在生成器内部加 range(n) 控制,避免无限运行风险:
- 适合一次性获取固定长度序列,比如初始化列表或测试用例
- 比无限生成器更安全,尤其在脚本中不易误触发无限循环
- 仍保持生成器的内存优势:不一次性构造整个列表
示例:
def fib_n(n):a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
list(fib_n(10)) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
与手写迭代器类对比
你也可以用类实现迭代器(重载 __iter__ 和 __next__),但生成器更简洁:
- 类写法需显式管理状态、处理 StopIteration 异常
- 生成器由解释器托管状态和异常,出错概率低,可读性强
- 两者都支持 for 遍历,但生成器天然支持 send()、throw() 等高级操作(如协程场景)
注意事项
使用时注意几个常见细节:
- 生成器对象只能遍历一次,用完即耗尽;需要重复使用请重新调用生成器函数
- 不要在生成器内部修改外部变量(除非有意共享状态),yield 暂停后恢复的是函数局部环境
- 若需线程安全,生成器本身不保证并发安全,必要时加锁或改用其他结构

















