__iter__ 必须返回带__next__的对象,因迭代器协议要求分离可迭代对象与迭代器;直接返回值会触发TypeError。为什么 __iter__ 必须返回一个带 __next__ 的对象,而不是直接返回值?因为迭代器协议要求分离「可迭代对象」和「迭代器本身」。调用 iter(obj) 时,__iter__ 被触发,它必须返回一个新对象(通常是自身或新实例),这个对象要能响应 next() —— 即实现 __next__。如果 __iter__ 直接 return 42 或 yield 一个值,for 循环会报 TypeError: iter() returned non-iterator。常见错误现象:TypeError: 'int' object is not iterable 或更具体的 TypeError: iter() returned non-iterator of type 'XXX',往往就是 __iter__ 返回了非迭代器类型。__iter__ 的职责是“提供一个迭代器”,不是“开始迭代”多数情况下,返回 self 是最简方案,但前提是类自己实现了 __next__若想支持多次独立遍历(比如多次 for 循环),__iter__ 应返回新实例,而非 self自定义迭代器时,__next__ 抛 StopIteration 的时机怎么把握?必须在「无更多数据可返回」的瞬间抛出,不能早、不能晚。早了(比如第一次就抛)会导致循环一次都不执行;晚了(比如已越界还返回旧值)会无限循环或返回脏数据。使用场景:遍历列表、文件行、生成有限序列(如斐波那契前 N 项)都依赖这个边界判断。立即学习“Python免费学习笔记(深入)”;典型模式:用索引或状态变量跟踪进度,每次 __next__ 先检查是否越界,再取值,最后更新状态切忌在 __next__ 开头就 raise StopIteration —— 那等于拒绝所有迭代不要用 return None 代替 raise StopIteration;Python 迭代器协议不认 None 为结束信号示例(安全写法): 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能

更多推荐