logo
55

生成器

⏱️ 30分钟

生成器(Generators):按需产出,节省内存

你现在可能会困惑什么

“list 已经够用,为什么还要 generator?”

当数据很大时,list 会一次性占内存;generator 边算边给,更适合流式处理。

一句话定义

生成器是包含 yield 的函数,每次迭代返回一个值并保留执行状态。

生活类比

list 像一次搬整箱水回家;generator 像每次喝一瓶再拿下一瓶。

最小可运行例子

def count_up_to(n):
    i = 1
    while i <= n:
        yield i
        i += 1

for x in count_up_to(3):
    print(x)

课堂小测(5 分钟)

  1. count_step(start, end, step)
  2. next() 手动取 3 次值。
  3. 观察耗尽后行为。

课堂小测参考答案与判分点

  • 参考答案方向:能写出可运行代码,并覆盖题目中的核心条件与边界输入。
  • 判分点 1(正确性):主流程结果正确,关键分支可执行。
  • 判分点 2(可读性):变量命名清晰,结构不过度嵌套。
  • 判分点 3(健壮性):对空值、类型错误或异常输入有基础保护。

迁移任务(课后)

实现 read_large_file(path),逐行 yield 并统计关键词命中数。

本节验收标准

你能独立做到:

  • 解释 yieldreturn 区别
  • 写出可消费的生成器
  • 选择合适场景使用 generator

常见报错与调试步骤(新手版)

  • 报错看不懂:先读最后一行错误类型(如 TypeErrorNameError),再回到对应代码行定位。
  • 不确定变量值:在关键位置临时 print(变量, type(变量)),先确认数据是否符合预期。
  • 改了代码却没生效:确认文件已保存、运行的是当前文件、终端环境(venv)是否正确。

常见误区

  • 误区:generator 可无限重复遍历。
  • 正解:耗尽后需重新创建。