news 2026/4/23 12:55:43

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/18 14:50:15

Python 访问者模式

Python 中的访问者模式&#xff08;Visitor Pattern&#xff09; 访问者模式是一种行为型设计模式&#xff0c;其核心目的是&#xff1a; 将算法&#xff08;操作&#xff09;与对象结构分离&#xff0c;让你在不改变对象结构的前提下&#xff0c;为该结构中的元素添加新的操作…

作者头像 李华
网站建设 2026/4/22 15:04:58

手把手实现STM32H7的UART DMA空闲接收

手把手教你用STM32H7实现UART DMA空闲中断接收&#xff1a;告别轮询&#xff0c;拥抱高效通信你有没有遇到过这样的场景&#xff1f;串口收数据时&#xff0c;每来一个字节就进一次中断&#xff0c;CPU被“打断”得喘不过气&#xff1b;Modbus协议帧长度不固定&#xff0c;靠超…

作者头像 李华
网站建设 2026/4/22 14:30:42

BongoCat终极使用指南:从新手到高手的快速上手指南

厌倦了单调的电脑操作体验&#xff1f;BongoCat正是为你的数字生活注入活力与趣味的完美解决方案。这款创新的桌面应用通过可爱的虚拟猫咪实时模拟你的输入动作&#xff0c;让每一次键盘敲击和游戏操作都变得生动有趣。无论你是程序员、作家还是游戏玩家&#xff0c;BongoCat都…

作者头像 李华
网站建设 2026/4/18 13:45:16

科研新视界:书匠策AI如何重构期刊论文写作生态

在学术研究的浩瀚星河中&#xff0c;期刊论文始终是研究者们展现智慧、传递思想的核心载体。然而&#xff0c;传统写作模式下的选题迷茫、文献梳理耗时、结构逻辑混乱等问题&#xff0c;如同无形的枷锁&#xff0c;束缚着研究者的创造力。如今&#xff0c;一款名为书匠策AI的科…

作者头像 李华
网站建设 2026/4/23 12:13:35

Dify如何平衡生成质量与token消耗成本?

Dify如何平衡生成质量与token消耗成本&#xff1f; 在大模型应用日益普及的今天&#xff0c;企业面临的不再是“能不能用AI”的问题&#xff0c;而是“如何用得又好又省”。一个看似简单的客服机器人&#xff0c;若设计不当&#xff0c;每月可能产生数百万甚至上千万的token消…

作者头像 李华
网站建设 2026/4/23 12:12:41

如何在Windows上快速部署Open-AutoGLM?这份保姆级教程让你一次成功

第一章&#xff1a;Windows上部署Open-AutoGLM的背景与意义 随着大语言模型技术的快速发展&#xff0c;本地化部署高性能推理模型成为企业与开发者关注的重点。Open-AutoGLM 作为一款开源的自动化生成语言模型&#xff0c;具备强大的文本理解与生成能力&#xff0c;支持在多种操…

作者头像 李华