Python中的迭代器协议与可迭代对象
字数 929 2025-11-09 07:50:05
Python中的迭代器协议与可迭代对象
描述:
在Python中,迭代器协议是支持迭代操作的核心机制。理解可迭代对象(Iterable)和迭代器(Iterator)的区别与联系,以及__iter__()和__next__()方法的作用,是掌握Python迭代机制的关键。
知识点详解:
-
可迭代对象(Iterable)
- 定义:任何实现了
__iter__()方法的对象,或者实现了__getitem__()方法且支持从0开始索引的对象。 - 作用:可被用于
for循环、列表推导式等迭代上下文中。 - 常见例子:列表、元组、字符串、字典、集合。
- 原理:当使用
for item in iterable时,Python首先调用iter(iterable),该函数会返回一个迭代器对象。
- 定义:任何实现了
-
迭代器(Iterator)
- 定义:实现了
__iter__()和__next__()方法的对象。__iter__()返回迭代器自身(即self),__next__()返回下一个元素,若无元素则抛出StopIteration异常。 - 特性:
- 迭代器是惰性计算的,每次只产生一个元素,节省内存。
- 迭代器只能向前迭代,不能回退或重置。
- 注意:迭代器本身也是可迭代对象(因实现了
__iter__())。
- 定义:实现了
-
协议执行流程
- 步骤1:对可迭代对象调用
iter(),获取其迭代器。 - 步骤2:重复调用迭代器的
__next__()方法,直到捕获StopIteration异常。 - 示例:
for循环的底层行为等价于:iterator = iter(iterable) # 调用iterable.__iter__() while True: try: item = next(iterator) # 调用iterator.__next__() except StopIteration: break # 循环体处理item
- 步骤1:对可迭代对象调用
示例与对比:
- 列表是可迭代对象,但不是迭代器(因其未实现
__next__())。 - 通过
iter(list)返回的列表迭代器是真正的迭代器。 - 自定义可迭代对象需实现
__iter__(),并返回一个迭代器对象;若自身同时实现__next__(),则__iter__()可返回self(即自身作为迭代器)。
总结:
- 可迭代对象:提供迭代的能力,但不直接执行迭代。
- 迭代器:实际执行迭代操作,维护迭代状态。
- 协议通过
__iter__和__next__方法解耦迭代逻辑,支持多种数据结构的灵活迭代。