一、什么是迭代器(Iterator)?
✔ 一句话解释
迭代器是一个可以被逐个取值的对象,它实现了
__iter__()和__next__()方法。
你可以把迭代器理解成:
一个"能记住当前位置"的取值器,每次取一个值,取完自动往后移动。
✔ 迭代器的两个核心方法
| 方法 | 作用 |
|---|---|
__iter__() |
返回迭代器本身 |
__next__() |
返回下一个值,没值时抛出 StopIteration |
✔ 为什么需要迭代器?
-
节省内存(不一次性加载全部数据)
-
支持 for 循环
-
支持惰性计算(需要时才取值)
比如读取大文件、处理大数据流时非常有用。
✔ 迭代器示例
lst = [1, 2, 3]
it = iter(lst)
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
二、什么是生成器(Generator)?
✔ 一句话解释
生成器是一种特殊的迭代器,用
yield关键字生成数据,边计算边返回,特别省内存。
生成器本质上就是:
自动帮你写好
__iter__()和__next__()的迭代器。
✔ 生成器的特点
-
用
yield生成数据 -
惰性计算(需要时才算)
-
非常省内存
-
适合大数据处理
✔ 生成器示例
def gen():
yield 1
yield 2
yield 3
g = gen()
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
三、迭代器 vs 生成器
| 对比项 | 迭代器 | 生成器 |
|---|---|---|
| 定义方式 | 实现 __iter__ + __next__ |
使用 yield |
| 写法 | 复杂 | 简单 |
| 内存占用 | 低 | 更低 |
| 是否惰性 | 是 | 是 |
| 是否自动实现迭代协议 | 否 | 是 |
你可以这样总结:
生成器是迭代器的语法糖,用起来更简单、更省内存。
四、为什么生成器特别重要?
你可以在面试里这样说:
生成器适合处理大数据,比如大文件读取、日志流式处理、网络数据流,因为它不会一次性把数据加载到内存,而是按需生成。
这句话非常加分。
五、结合你的项目经验
你在 AIGC 项目里做过流式输出(StreamingResponse),你可以这样回答:
FastAPI 的流式输出本质上就是一个生成器,每次 yield 一段内容,让前端实时收到数据。
这会让面试官觉得你不仅懂概念,还懂实战。
六、最终总结
迭代器是实现了
__iter__()和__next__()的对象,用来逐个取值; 生成器是用yield写的特殊迭代器,支持惰性计算,更省内存,适合大数据处理。