news 2026/2/9 1:49:33

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/2/7 2:10:41

JLink驱动安装无反应?聚焦USB通信层操作指南

JLink驱动安装无反应&#xff1f;别急着重装&#xff0c;先看懂USB通信链路 你有没有遇到过这样的场景&#xff1a; 手握一块崭新的J-Link调试器&#xff0c;项目正等着烧录固件&#xff0c;结果插上电脑——设备管理器里 悄无声息 &#xff1b;运行J-Link Installer&#…

作者头像 李华
网站建设 2026/2/8 19:20:35

Open-AutoGLM插件究竟有多强?(9大核心功能首次曝光)

第一章&#xff1a;Open-AutoGLM插件究竟有多强&#xff1f; Open-AutoGLM 是一款基于 GLM 大模型生态开发的智能化插件系统&#xff0c;专为提升自动化任务处理能力而设计。它不仅支持自然语言理解与生成&#xff0c;还能深度集成到各类企业级应用中&#xff0c;实现从数据解析…

作者头像 李华
网站建设 2026/2/7 3:46:04

Open-AutoGLM安装卡在第3步?专家级解决方案一次性解决5类常见报错

第一章&#xff1a;Windows平台部署Open-AutoGLM概述在Windows平台上部署Open-AutoGLM为本地大模型应用开发与测试提供了便捷环境。该框架结合了AutoGLM的自动化推理能力与开放架构&#xff0c;支持在资源受限的桌面环境中运行轻量化大语言任务。部署过程依赖Python生态与相关A…

作者头像 李华
网站建设 2026/2/8 10:39:23

BongoCat终极桌面伴侣:快速打造你的专属互动猫咪

BongoCat终极桌面伴侣&#xff1a;快速打造你的专属互动猫咪 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作&#xff0c;每一次输入都充满趣味与活力&#xff01; 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 厌倦了单调的…

作者头像 李华
网站建设 2026/2/6 22:24:00

OpenProject 开源项目管理平台:敏捷团队协作的终极解决方案

OpenProject 开源项目管理平台&#xff1a;敏捷团队协作的终极解决方案 【免费下载链接】taiga Taiga is a free and open-source project management for cross-functional agile teams. 项目地址: https://gitcode.com/gh_mirrors/taig/taiga 你是否曾经在项目管理中遇…

作者头像 李华
网站建设 2026/2/6 15:01:55

智谱Open-AutoGLM直接使用全攻略(新手必看的3个关键步骤)

第一章&#xff1a;智谱 Open-AutoGLM 直接使用概述 智谱 AI 推出的 Open-AutoGLM 是一款面向自动化自然语言处理任务的大模型工具&#xff0c;支持零样本与少样本学习&#xff0c;适用于文本分类、信息抽取、问答生成等多种场景。用户无需进行复杂微调即可通过简单接口调用实现…

作者头像 李华