Python中可迭代对象必须实现__iter__方法并返回迭代器;迭代器需同时实现__iter__(返回self)和__next__;推荐分离二者以支持多次迭代,避免状态干扰。

在 Python 中,一个对象要成为可迭代对象(iterable),关键在于它实现了 __iter__ 方法,并且该方法必须返回一个迭代器(iterator)对象——即实现了 __iter__ 和 __next__ 方法的对象。
可迭代对象的核心要求
只要类中定义了 __iter__ 方法,并返回一个具备迭代能力的对象(通常是自身或新创建的迭代器实例),该类的实例就能被用于 for 循环、list()、tuple() 等操作。
-
__iter__必须返回一个迭代器,不能返回普通值(如数字、字符串、列表等) - 返回的迭代器必须实现
__next__方法,控制每次取值逻辑 - 迭代器本身也必须实现
__iter__(通常返回self),以满足“迭代器也是可迭代对象”的协议
常见实现方式:自身作为迭代器
适用于逻辑简单、状态单一的场景,比如顺序遍历内部列表或生成固定序列。此时让类同时承担可迭代对象和迭代器的角色。
示例:
立即学习“Python免费学习笔记(深入)”;
class Countdown:
def __init__(self, start):
self.start = start
<pre class="brush:php;toolbar:false;">def __iter__(self):
return self # 返回自身
def __next__(self):
if self.start <= 0:
raise StopIteration
self.start -= 1
return self.start + 1
使用时:
PHPCMS V9采用OOP(面向对象)方式进行基础运行框架搭建。模块化开发方式做为功能开发形式。框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求。 PHPCMS V9企业黄页主要特色1、模型自定义,支持模型添加、修改、删除、导出、导入功能;2、模型字段自定义,支持模型字段添加、修改、删除、禁用操作;3、分类无限添加,支持批量多级添加;4、新增附件字段功能,实现相同模型,不
for i in Countdown(3): print(i) → 输出 3 2 1
推荐实现方式:分离可迭代对象与迭代器
更清晰、可复用性更高,尤其适合需要多次迭代、或状态需隔离的场景(例如多个 for 循环同时进行)。
- 可迭代对象的
__iter__每次调用都新建一个迭代器实例 - 迭代器类独立封装状态(如索引、游标),避免重复迭代时相互干扰
- 符合 Python 迭代协议的设计习惯,也便于调试和扩展
示例:
立即学习“Python免费学习笔记(深入)”;
class Numbers:
def __init__(self, data):
self.data = data
<pre class="brush:php;toolbar:false;">def __iter__(self):
return NumbersIterator(self.data) # 每次返回新迭代器class NumbersIterator: def init(self, data): self.data = data self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
value = self.data[self.index]
self.index += 1
return value
注意点与易错情况
实际编码中容易忽略以下细节:
- 只实现
__iter__但返回的是列表等内置可迭代对象(如return self.items)——虽然能用,但不是自定义迭代器;若想完全控制迭代行为,仍应返回自定义迭代器实例 - 在
__iter__中直接用yield(即返回生成器函数),本质是返回生成器对象(它本身就是迭代器),这是一种简洁有效的替代写法 - 误在可迭代对象上实现
__next__而不配__iter__——这会让对象变成迭代器,但不再是“可迭代对象”,无法被多次for使用(因迭代器只能消耗一次)









