news 2026/4/14 17:19:53

Python 迭代器模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 迭代器模式

Python 中的迭代器模式(Iterator Pattern)

迭代器模式是一种行为型设计模式,其核心目的是:
提供一种方法顺序访问一个聚合对象(容器)中的各个元素,而又无需暴露该对象的内部表示

形象比喻:就像翻书——你只需要调用“下一页”操作,就能依次阅读内容,而不需要知道书是怎么装订的、页码怎么存储的。

迭代器模式的优点
  • 分离遍历行为与容器:容器只负责存储数据,迭代器负责遍历
  • 支持多种遍历方式(正向、反向、过滤等)
  • 符合单一职责原则:容器和迭代器各司其职
  • 支持惰性加载:只在需要时获取下一个元素
Python 中的特殊之处

Python 语言内置了对迭代器模式的最完美支持,通过迭代协议(Iteration Protocol)实现:

  • 任何实现了__iter__()__next__()方法的对象都是迭代器
  • 任何实现了__iter__()方法的对象都是可迭代对象(Iterable)
  • for循环、list()tuple()sum()等都自动使用迭代器协议

因此,在 Python 中,迭代器模式几乎不需要手动实现,但理解其原理有助于写出更高效、更优雅的代码。

Python 内置迭代器示例
# 列表本身是可迭代对象(Iterable)my_list=[1,2,3,4]# 获取其迭代器it=iter(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)# 等价于:it=iter(my_list)whileTrue:try:item=next(it)print(item)exceptStopIteration:break
手动实现迭代器模式(经典方式)
classReverseIterator:"""反向迭代器"""def__init__(self,data):self.data=data self.index=len(data)# 从末尾开始def__iter__(self):returnselfdef__next__(self):ifself.index==0:raiseStopIteration self.index-=1returnself.data[self.index]classMyCollection:"""容器类"""def__init__(self,items):self.items=itemsdef__iter__(self):returniter(self.items)# 正向迭代(使用内置)defreverse_iter(self):returnReverseIterator(self.items)# 提供反向迭代器# 使用collection=MyCollection([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,b=0,1for_inrange(n):yielda a,b=b,a+b# 使用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:x<5,[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),欢迎继续问!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 23:06:34

TeslaMate完整搭建指南:快速构建免费特斯拉数据分析平台

TeslaMate完整搭建指南&#xff1a;快速构建免费特斯拉数据分析平台 【免费下载链接】teslamate 项目地址: https://gitcode.com/gh_mirrors/tes/teslamate 想要深入了解你的特斯拉性能表现吗&#xff1f;TeslaMate作为开源自托管解决方案&#xff0c;能够帮助你全面监…

作者头像 李华
网站建设 2026/4/11 9:18:40

IINA终极指南:macOS视频播放器的10个高效使用方案

IINA终极指南&#xff1a;macOS视频播放器的10个高效使用方案 【免费下载链接】iina 项目地址: https://gitcode.com/gh_mirrors/iin/iina 您是否曾经为在macOS上找不到理想的视频播放器而烦恼&#xff1f;当您需要播放多种格式的视频文件、管理复杂的字幕需求&#xf…

作者头像 李华
网站建设 2026/4/15 3:33:32

Open-AutoGLM悄然崛起:与ChatGLM的4个关键区别你必须掌握

第一章&#xff1a;Open-AutoGLM与ChatGLM的演进背景近年来&#xff0c;随着大规模语言模型技术的快速发展&#xff0c;自然语言处理在多个领域实现了突破性进展。其中&#xff0c;ChatGLM系列模型作为智谱AI推出的高性能双语对话模型&#xff0c;凭借其基于GLM&#xff08;Gen…

作者头像 李华
网站建设 2026/4/13 10:54:26

AutoAWQ深度解析:大模型量化加速的完整解决方案

AutoAWQ深度解析&#xff1a;大模型量化加速的完整解决方案 【免费下载链接】AutoAWQ AutoAWQ implements the AWQ algorithm for 4-bit quantization with a 2x speedup during inference. 项目地址: https://gitcode.com/gh_mirrors/au/AutoAWQ 还在为大型语言模型的高…

作者头像 李华
网站建设 2026/4/11 9:14:52

为什么越来越多开发者选择Dify进行Agent开发?

为什么越来越多开发者选择 Dify 进行 Agent 开发&#xff1f; 在企业智能化浪潮席卷各行各业的今天&#xff0c;AI 不再只是实验室里的前沿技术&#xff0c;而是真正走进了客服窗口、内容工厂和内部知识系统。尤其是以大语言模型&#xff08;LLM&#xff09;为核心的 AI Agent …

作者头像 李华
网站建设 2026/4/12 12:34:56

专业级iOS设备越狱:palera1n工具深度解析与实战指南

在iOS生态系统的安全研究领域&#xff0c;设备越狱始终占据着重要地位。本文将为技术爱好者和安全研究人员深入剖析palera1n越狱工具的技术架构、操作原理及实战应用&#xff0c;帮助您全面掌握这一专业级越狱解决方案。 【免费下载链接】palera1n Jailbreak for arm64 devices…

作者头像 李华