迭代器协议
理解 __iter__ 和 __next__
- 理解可迭代对象和迭代器
- 实现自定义迭代器
- iter() 和 next()
迭代器协议
可迭代对象要实现 __iter__,返回迭代器。迭代器要实现 __next__,返回下一个值,耗尽时抛 StopIteration。
iter() 和 next()
for x in obj 等价于:it = iter(obj); while True: try: x = next(it) except StopIteration: break。
生成器是 Python 最被低估的特性之一。处理大文件时,f.readlines() 会把整个文件读进内存(可能几个 G),而 for line in f 是逐行读取的(本质是生成器),内存占用恒定。数据处理管道用生成器链式拼接:(transform(x) for x in source if condition(x)),惰性求值,内存效率极高。生成器只能遍历一次,遍历完就耗尽了。多次使用就转成 list。
it = iter("ab")
print(next(it))
print(next(it))迭代器耗尽时抛出?
资深工程师加餐
底层原理 · 大厂视角 · 工程经验,点卡片展开
with 语句等价于 try/finally:无论正常结束还是中途抛异常,退出时都会执行清理(关文件、释放锁、断开连接)。实现方式有两种:类里写 __enter__/__exit__,或用 contextlib.contextmanager 把生成器变成上下文管理器。凡是「打开了必须关闭/获取了必须释放」的资源,都应该用 with 托管。
挑战任务
迭代器挑战
实现斐波那契迭代器。
课后作业
无限迭代器
实现无限自然数迭代器(用islice截取)。