迭代器是实现了 __iter____next__ 协议的对象,逐个产生元素;生成器是一种特殊的迭代器,由包含 yield 的函数(或生成器表达式)自动创建,写法上不需要手动维护迭代状态。

区别要点:所有生成器都是迭代器,反之不然。生成器由语法糖自动实现协议,普通迭代器需要自己写类并保存游标状态。

yield 的工作原理:调用生成器函数时不会执行函数体,而是返回一个生成器对象;每次 next() 时从上次暂停处继续执行,遇到 yield 把值吐出去,函数的局部变量和指令位置被完整保存在生成器对象的栈帧中,下次恢复继续。迭代结束(函数返回)时抛出 StopIteration

def countdown(n):
    while n > 0:
        yield n
        n -= 1

g = countdown(3)   # 什么都不执行
next(g)  # 3,暂停在 yield 处

关键优势是惰性求值:处理大数据流时内存占用 O(1)。进阶点:send() 可双向通信(协程基础)、yield from 委托子生成器。追问方向:生成器如何实现协程、async/await 与生成器的渊源。