Python3 迭代器与生成器
Python3 学习笔记 · 整理自菜鸟教程
一句话
迭代器是实现了 __iter__() 和 __next__() 的对象;生成器是用 yield 自动造出迭代器的函数,写起来更省事、更省内存。
要点
- 可迭代对象(iterable):能用于
for的对象,如列表、字符串、字典、文件。 - 迭代器(iterator):既能被
for遍历,又能被next()逐个取值。 iter(x)把可迭代对象变成迭代器;next(it)取下一个值。- 迭代器一次性:耗尽后不再返回值,只能重新
iter()。 - 生成器函数含
yield,调用时返回生成器对象,不立即执行函数体。 - 每次
next()执行到yield处暂停,保留局部变量,下次从暂停处继续。 yield可返回多个值(本质是元组),也可用send()向生成器传值。- 生成器是惰性求值:不一次性算完,适合处理大文件、无限序列。
语法 / 常用方法
| 语法/方法 | 说明 | 示例 |
|---|---|---|
iter(obj) |
得到迭代器 | it = iter([1, 2, 3]) |
next(it) |
取下一个值,耗尽抛 StopIteration |
next(it) → 1 |
next(it, default) |
耗尽时返回默认值,不抛异常 | next(it, None) |
for x in it |
自动迭代,捕获 StopIteration |
for x in it: print(x) |
yield value |
生成器暂停并产出一个值 | yield i |
yield from seq |
委托给另一个可迭代对象 | yield from [1, 2] |
gen.send(v) |
唤醒生成器并传入值 | g.send(10) |
gen.close() |
关闭生成器,抛 GeneratorExit |
g.close() |
(x for x in ...) |
生成器表达式,最简写法 | sum(x*x for x in range(5)) |
代码示例
1 | |
易错点
- 迭代器只能遍历一次,第二次
for没有输出,需要重新iter()。 - 生成器函数调用后不执行,第一次
next()才真正运行。 - 忘记实现
__iter__或__next__,对象无法迭代。 - 耗尽迭代器后继续
next()会抛StopIteration,用next(it, default)兜底。 return在生成器里会结束生成,return value的值挂在StopIteration.value,不直接返回。- 生成器里若有
try/finally,close()会触发finally清理。