Python设计模式详解之15 ——迭代器模式
Python 中的 Iterator(迭代器)设计模式 是一种行为型设计模式,用于逐一访问集合对象中的元素而不暴露其底层实现。Python 本身对迭代器模式提供了良好的支持,迭代器通常通过 __iter__
和 __next__
方法实现。
迭代器模式的组成
-
迭代器对象:实现了
__iter__()
和__next__()
方法。__iter__()
:返回自身的迭代器对象(通常是self
)。__next__()
:返回集合中的下一个元素。如果没有更多元素,则抛出StopIteration
异常。
-
可迭代对象:实现了
__iter__()
方法,返回一个迭代器对象。
如何实现迭代器模式
以下是一个自定义实现的示例:
示例:一个范围的自定义迭代器
class MyRange:
def __init__(self, start, end):
self.start = start
self.end = end
def __iter__(self):
return MyRangeIterator(self.start, self.end)
class MyRangeIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current >= self.end:
raise StopIteration
value = self.current
self.current += 1
return value
# 使用自定义迭代器
for num in MyRange(1, 5):
print(num)
输出:
1
2
3
4
Python 内置迭代器支持
在 Python 中,许多内置对象(如列表、字典、集合等)本身就实现了迭代器协议。您可以直接使用 iter()
和 next()
来操作这些对象:
# 迭代器操作
nums = [1, 2, 3]
iter_nums = iter(nums) # 获取迭代器
print(next(iter_nums)) # 输出 1
print(next(iter_nums)) # 输出 2
print(next(iter_nums)) # 输出 3
生成器与迭代器
生成器是创建迭代器的一种简单方式。生成器通过函数实现,使用 yield
语句逐步生成值。
def my_range(start, end):
current = start
while current < end:
yield current
current += 1
# 使用生成器
for num in my_range(1, 5):
print(num)
输出与上面的自定义迭代器一致。
场景与优点
- 延迟计算:迭代器一次生成一个值,适合处理大数据或无限数据流。
- 抽象与封装:通过迭代器,可以隐藏数据结构的内部实现。
总结
Python 的迭代器设计模式在日常开发中非常常见,可以通过自定义类或生成器灵活实现。实际开发中,优先选择生成器实现,因为它更简洁易读,同时符合 Pythonic 风格。