Python 高级
迭代器协议
理解 __iter__ 和 __next__
- 理解可迭代对象和迭代器
- 实现自定义迭代器
- iter() 和 next()
迭代器协议
可迭代对象要实现 __iter__,返回迭代器。迭代器要实现 __next__,返回下一个值,耗尽时抛 StopIteration。
示例代码(可运行)
Python 0%
iter() 和 next()
示例代码(可运行)
Python 0%
ℹ️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
实现斐波那契迭代器。
迭代器挑战
Python 0%
2 个测试用例
课后作业
无限迭代器
中等+20 XP
实现无限自然数迭代器(用islice截取)。
无限迭代器
Python 0%
1 个测试用例