python迭代器协议要求对象实现__iter__()和__next__()方法;可通过自定义迭代器类、生成器函数、iter()转换、itertools模块或类型检查来实现与验证。

Python迭代器协议是一组约定,用于定义对象如何被迭代。当一个对象实现了 __iter__() 和 __next__() 这两个特殊方法时,它就符合迭代器协议。以下是实现与使用该协议的关键方式:
一、实现迭代器类
通过自定义类显式实现迭代器协议,可控制每次迭代返回的值及终止条件。该方式适用于需要维护内部状态或复杂遍历逻辑的场景。
1、定义一个类,在其内部实现 __iter__() 方法,该方法必须返回 self 或另一个迭代器对象。
2、在同一个类中实现 __next__() 方法,该方法返回下一个元素;当无更多元素时,抛出 StopIteration 异常。
立即学习“Python免费学习笔记(深入)”;
3、在 __next__() 中维护一个内部索引或状态变量,确保每次调用返回正确顺序的值。
二、使用生成器函数替代迭代器类
生成器函数是更简洁的迭代器实现方式,Python 自动将其转换为迭代器对象。函数体内使用 yield 表达式即可暂停并返回值,无需手动管理状态或异常。
1、定义一个普通函数,在其中使用一个或多个 yield 语句返回中间结果。
2、调用该函数时不会立即执行,而是返回一个生成器对象,该对象自动具备 __iter__() 和 __next__() 方法。
3、对该生成器对象使用 next() 或置于 for 循环中触发逐次求值。
三、将可迭代对象转换为迭代器
任何实现了 __iter__() 方法的对象(如列表、元组、字符串)都可通过内置函数 iter() 转换为迭代器,从而获得对单次遍历过程的精确控制。
1、对一个列表 [1, 2, 3] 调用 iter(),得到一个列表迭代器。
2、使用 next() 逐次获取元素,直到触发 StopIteration 异常。
3、可在循环中配合 try-except 捕获异常,实现手动终止逻辑而非依赖 for 的隐式处理。
四、使用 itertools 模块构建高级迭代模式
itertools 提供了大量预构建的迭代器工具,可组合、截断、重复或合并其他迭代器,避免重复编写底层协议代码。
1、导入模块:使用 import itertools。
2、调用 itertools.count() 创建无限计数迭代器,或用 itertools.islice() 截取有限片段。
3、使用 itertools.chain() 将多个可迭代对象串联为单一迭代器,其行为完全符合迭代器协议。
五、判断对象是否符合迭代器协议
可通过检查对象是否具备必需的方法来验证其是否为迭代器或可迭代对象,这对动态类型处理和调试非常有用。
1、使用 hasattr(obj, '__iter__') 判断是否为可迭代对象。
2、进一步检查 hasattr(obj, '__next__') 并结合 isinstance(obj, collections.abc.Iterator) 确认是否为真正的迭代器。
3、注意区分:仅实现 __iter__() 的对象是可迭代对象,但只有同时具备 __next__() 且由 __iter__() 返回自身时,才是迭代器。










