Python迭代器协议:__iter__和__next__方法详解 - Python高级编程教程
- Python
- 2025-08-07
- 974
Python迭代器协议
深入理解__iter__和__next__方法
什么是迭代器协议?
在Python中,迭代器协议是一种允许对象被迭代的标准方式。任何支持迭代器协议的对象都可以在for
循环、列表推导式和其他迭代上下文中使用。
迭代器协议要求对象实现两个核心方法:
__iter__()
- 返回迭代器对象本身__next__()
- 返回序列中的下一个元素
理解这两个方法的工作原理是掌握Python迭代机制的关键。
__iter__方法详解
__iter__()
方法负责返回一个迭代器对象。对于迭代器本身,通常返回self
。
当你使用iter()
内置函数或在for
循环中使用对象时,Python会自动调用此方法。
__iter__方法的特点:
- 必须返回一个实现了
__next__()
方法的对象 - 对于迭代器对象,通常返回
self
- 允许迭代器在
for
循环中使用 - 可以被多次调用,每次返回新的迭代器
__next__方法详解
__next__()
方法负责返回序列中的下一个元素。当没有更多元素可用时,它应该引发StopIteration
异常。
在for
循环中,Python会自动处理这个异常来终止迭代。
__next__方法的特点:
- 每次调用返回序列中的下一个元素
- 必须维护迭代的当前状态
- 元素耗尽时引发
StopIteration
异常 - 由
next()
内置函数调用
迭代器实现示例
下面是一个自定义迭代器的实现示例,该迭代器生成指定范围内的偶数:
class EvenNumbers:
"""生成指定范围内偶数的迭代器"""
def __init__(self, start, end):
self.current = start
self.end = end
# 确保从偶数开始
if self.current % 2 != 0:
self.current += 1
def __iter__(self):
"""返回迭代器对象本身"""
return self
def __next__(self):
"""返回下一个偶数"""
if self.current > self.end:
raise StopIteration
value = self.current
self.current += 2
return value
# 使用自定义迭代器
print("10到20之间的偶数:")
for num in EvenNumbers(10, 20):
print(num, end=' ')
# 输出: 10 12 14 16 18 20
在上面的示例中:
__init__
方法初始化迭代范围__iter__
返回迭代器本身(self)__next__
返回下一个偶数并更新状态- 当超过结束值时,引发
StopIteration
迭代器的实际应用
迭代器协议在许多Python功能中发挥着核心作用:
1. for循环
Python的for
循环内部会自动调用iter()
和next()
函数:
numbers = [1, 2, 3] iterator = iter(numbers) while True: try: num = next(iterator) print(num) except StopIteration: break
2. 生成器表达式
生成器表达式创建实现了迭代器协议的生成器对象:
squares = (x*x for x in range(5)) print(next(squares)) # 输出: 0 print(next(squares)) # 输出: 1
3. 内置函数
许多内置函数如map()
、filter()
和zip()
返回迭代器:
doubled = map(lambda x: x*2, [1, 2, 3]) print(list(doubled)) # 输出: [2, 4, 6]
关键总结
- 迭代器协议由
__iter__
和__next__
两个方法组成 __iter__
返回迭代器对象(通常是self)__next__
返回下一个值并在结束时引发StopIteration- 自定义迭代器可以处理大型数据流而无需一次性加载所有数据
- 迭代器是Python中许多高级功能的基础(生成器、协程等)
迭代器 vs 可迭代对象
特性 | 可迭代对象 | 迭代器 |
---|---|---|
实现方法 | __iter__() | __iter__() 和 __next__() |
功能 | 可以被迭代 | 执行迭代并维护状态 |
状态 | 无状态 | 维护当前迭代位置 |
使用 | for循环、生成器等 | 通过next()逐个获取元素 |
示例 | 列表、元组、字典 | 文件对象、生成器对象 |
迭代器最佳实践
内存效率
迭代器一次只产生一个元素,非常适合处理大型数据集或无限序列,避免一次性加载所有数据到内存中。
惰性求值
迭代器采用惰性求值策略,只在需要时计算下一个值,这可以显著提高性能。
组合使用
迭代器可以轻松组合使用:
# 链式迭代器示例 import itertools numbers = range(10) squared = (x**2 for x in numbers) filtered = filter(lambda x: x % 2 == 0, squared) for num in filtered: print(num)
本文由KangSiChong于2025-08-07发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://www.521pj.cn/20257546.html
发表评论