2026/1/27 23:48:12
网站建设
项目流程
做网站用什么语言和工具,广东做淘宝的都在哪里网站,手机能用的网站,四川学校网站建设公Python 中的迭代器模式#xff08;Iterator Pattern#xff09;
迭代器模式是一种行为型设计模式#xff0c;其核心目的是#xff1a; 提供一种方法顺序访问一个聚合对象#xff08;容器#xff09;中的各个元素#xff0c;而又无需暴露该对象的内部表示。
形象比喻Iterator Pattern迭代器模式是一种行为型设计模式其核心目的是提供一种方法顺序访问一个聚合对象容器中的各个元素而又无需暴露该对象的内部表示。形象比喻就像翻书——你只需要调用“下一页”操作就能依次阅读内容而不需要知道书是怎么装订的、页码怎么存储的。迭代器模式的优点分离遍历行为与容器容器只负责存储数据迭代器负责遍历支持多种遍历方式正向、反向、过滤等符合单一职责原则容器和迭代器各司其职支持惰性加载只在需要时获取下一个元素Python 中的特殊之处Python 语言内置了对迭代器模式的最完美支持通过迭代协议Iteration Protocol实现任何实现了__iter__()和__next__()方法的对象都是迭代器任何实现了__iter__()方法的对象都是可迭代对象Iterablefor循环、list()、tuple()、sum()等都自动使用迭代器协议因此在 Python 中迭代器模式几乎不需要手动实现但理解其原理有助于写出更高效、更优雅的代码。Python 内置迭代器示例# 列表本身是可迭代对象Iterablemy_list[1,2,3,4]# 获取其迭代器ititer(my_list)# 调用 my_list.__iter__()print(next(it))# 1 调用 it.__next__()print(next(it))# 2print(next(it))# 3print(next(it))# 4# print(next(it)) # 抛出 StopIteration 异常表示迭代结束for循环内部就是这样工作的foriteminmy_list:print(item)# 等价于ititer(my_list)whileTrue:try:itemnext(it)print(item)exceptStopIteration:break手动实现迭代器模式经典方式classReverseIterator:反向迭代器def__init__(self,data):self.datadata self.indexlen(data)# 从末尾开始def__iter__(self):returnselfdef__next__(self):ifself.index0:raiseStopIteration self.index-1returnself.data[self.index]classMyCollection:容器类def__init__(self,items):self.itemsitemsdef__iter__(self):returniter(self.items)# 正向迭代使用内置defreverse_iter(self):returnReverseIterator(self.items)# 提供反向迭代器# 使用collectionMyCollection([1,2,3,4,5])print(正向遍历)forxincollection:print(x)print(\n反向遍历)forxincollection.reverse_iter():print(x)输出正向遍历 1 2 3 4 5 反向遍历 5 4 3 2 1更 Pythonic 的方式使用生成器推荐生成器是 Python 中实现迭代器的最简洁方式使用yield关键字。defreverse_generator(data):生成器函数反向遍历foriinrange(len(data)-1,-1,-1):yielddata[i]deffibonacci_generator(n):生成斐波那契数列惰性计算a,b0,1for_inrange(n):yielda a,bb,ab# 使用data[1,2,3,4,5]print(反向生成器)forxinreverse_generator(data):print(x)print(\n斐波那契数列前 10 项)fornuminfibonacci_generator(10):print(num,end )# 输出0 1 1 2 3 5 8 13 21 34生成器自动实现了__iter__()和__next__()并且支持StopIteration。内置强大迭代工具itertools 模块Python 标准库itertools提供了大量高效的迭代器工具importitertools data[1,2,3]# 无限循环# for x in itertools.cycle(data): ...# 重复元素print(list(itertools.repeat(10,3)))# [10, 10, 10]# 累积print(list(itertools.accumulate([1,2,3,4])))# [1, 3, 6, 10]# 组合print(list(itertools.combinations(ABC,2)))# [(A, B), (A, C), (B, C)]# 过滤print(list(itertools.takewhile(lambdax:x5,[1,4,6,7,1])))# [1, 4]# 链式连接print(list(itertools.chain(ABC,DEF)))# [A, B, C, D, E, F]迭代器模式结构总结角色Python 中的对应Iterator实现__iter__()和__next__()的对象ConcreteIterator自定义迭代器类或生成器Aggregate可迭代对象实现__iter__()ConcreteAggregatelist、tuple、dict、set、str 等迭代器 vs 生成器 vs 可迭代对象概念是否可多次遍历是否惰性计算示例可迭代对象是否list, tuple, str迭代器否一次用完是iter(lst), 自定义迭代器生成器否是yield 函数, (x for x in)Python 中的实际应用场景文件读取for line in open(file.txt):惰性读取不一次性加载数据库查询ORM 的查询集通常是惰性迭代器数据流处理处理大数据时避免内存爆炸无限序列如斐波那契、素数生成器zip()、enumerate()、reversed()、sorted()等返回迭代器最佳实践建议优先使用生成器写迭代器时几乎总是用yield而不是手动实现类避免在循环中调用 list()除非真的需要全部数据否则保持惰性自定义容器时实现__iter__()让它支持for循环使用 itertools解决 90% 的复杂遍历需求# 推荐惰性读取大文件defread_large_file(file_path):withopen(file_path)asf:forlineinf:# 每次只读一行yieldline.strip()总结在 Python 中迭代器模式不是“需要实现”的模式而是**语言核心特性**。掌握迭代协议和生成器你就掌握了 Python 中最强大的数据处理工具之一。如果你想看更高级的例子如自定义可迭代容器、树结构遍历器、无限迭代器、协程与生成器的结合或者如何用迭代器实现数据管道Pipeline欢迎继续问