20 分钟
Python 高级

迭代器协议

理解 __iter__ 和 __next__

  • 理解可迭代对象和迭代器
  • 实现自定义迭代器
  • iter() 和 next()

迭代器协议

可迭代对象要实现 __iter__,返回迭代器。迭代器要实现 __next__,返回下一个值,耗尽时抛 StopIteration。

示例代码(可运行)

iter() 和 next()

示例代码(可运行)
ℹ️for循环的本质

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))
找 Bug缺少__iter__方法,对象不可迭代。
class Range: def __init__(self,n): self.n=n; self.i=0 def __next__(self): if self.i>=self.n: raise StopIteration self.i+=1; return self.i-1
填空题填写空白处的代码
it = iter([1,2]) print(next(it)) #
选择题

迭代器耗尽时抛出?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

with 语句等价于 try/finally:无论正常结束还是中途抛异常,退出时都会执行清理(关文件、释放锁、断开连接)。实现方式有两种:类里写 __enter__/__exit__,或用 contextlib.contextmanager 把生成器变成上下文管理器。凡是「打开了必须关闭/获取了必须释放」的资源,都应该用 with 托管。

挑战任务

迭代器挑战

简单+50 XP

实现斐波那契迭代器。

迭代器挑战
2 个测试用例

课后作业

无限迭代器

中等+20 XP

实现无限自然数迭代器(用islice截取)。

无限迭代器
1 个测试用例