news 2026/9/2 16:40:06

python-第18天:迭代器与生成器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python-第18天:迭代器与生成器

Python 进阶基石:深入浅出迭代器(Iterator)与生成器(Generator)全攻略

在 Python 的编程世界里,**迭代器(Iterator)生成器(Generator)**是两个至关重要但常让初学者感到困惑的概念。它们不仅是 Python 实现高效循环的基础,更是处理大规模数据、优化内存占用的核心武器。

本文将以系统化的视角,带你从零开始深入理解这两个核心概念。


1. 前置准备

在深入学习之前,你只需要具备以下基础知识:

  • 了解 Python 的基本语法(如变量、函数)。
  • 熟悉基础数据结构(如列表list、元组tuple)。
  • 知道如何使用for...in循环。

2. 迭代器(Iterator):循环背后的功臣

2.1 什么是可迭代对象(Iterable)?

在 Python 中,凡是可以使用for循环遍历的对象,都称为可迭代对象。例如:列表、字符串、字典、元组。

2.2 什么是迭代器(Iterator)?

迭代器是一个可以记住遍历位置的对象。它从集合的第一个元素开始访问,直到所有的元素被访问完结束。

核心区别:

  • 可迭代对象:手里拿着一本书(你可以翻看它)。
  • 迭代器:一个正在翻书的手指(它记录了当前翻到了哪一页,并能跳到下一页)。

2.3 迭代器协议:iter()next()

Python 迭代器的实现依赖于两个内建函数:

  1. iter(): 将可迭代对象转换为迭代器。
  2. next(): 返回迭代器的下一个元素。
# 示例:手动操作迭代器my_list=[1,2,3]# 1. 获取迭代器my_iter=iter(my_list)# 2. 使用 next() 逐个获取元素print(next(my_iter))# 输出: 1print(next(my_iter))# 输出: 2print(next(my_iter))# 输出: 3# 3. 如果再次调用 next(),会抛出 StopIteration 异常# print(next(my_iter))

3. 生成器(Generator):优雅的高效方案

3.1 为什么需要生成器?

假设你需要处理一个包含 10 亿个数字的列表。如果你直接创建一个列表,它会瞬间撑爆你的内存。
生成器的出现解决了这个问题:它不会一次性把所有数据存在内存中,而是在循环到它时才“现场计算”出来。这种机制称为惰性求值(Lazy Evaluation)

3.2 如何创建生成器?

创建生成器有两种主要方式:

方法 A:生成器函数(使用yield

当一个函数包含yield关键字时,它就不再是一个普通函数,而是一个生成器函数。

defcount_up_to(n):count=1whilecount<=n:yieldcount# 暂停函数并返回当前值count+=1# 调用函数返回的是一个生成器对象counter=count_up_to(3)print(next(counter))# 输出: 1print(next(counter))# 输出: 2print(next(counter))# 输出: 3

yield的魔力:

  • 当执行到yield时,函数会暂停并保存当前所有的运行状态。
  • 下一次调用next()时,函数会从刚才暂停的地方继续执行
方法 B:生成器表达式

类似于列表推导式,但使用圆括号

# 列表推导式(占用内存)squares_list=[x**2forxinrange(5)]# 生成器表达式(节省内存)squares_gen=(x**2forxinrange(5))print(squares_gen)# 输出: <generator object ...>

4. 迭代器 vs 生成器:深度对比

特性迭代器 (Iterator)生成器 (Generator)
实现方式需实现__iter____next__类方法使用yield函数或生成器表达式
内存占用相对较低极低(随用随生成)
代码复杂度较复杂,需要定义类非常简洁
本质所有的生成器都是迭代器迭代器不一定是生成器

5. 常见坑点与注意事项

5.1 迭代器是“一次性”的

迭代器和生成器只能向前遍历,不能后退或重置。一旦遍历完成,如果你想再次使用,必须重新创建一个新的迭代器对象。

gen=(xforxinrange(3))list(gen)# [0, 1, 2]list(gen)# [] -> 已经空了!

5.2 StopIteration 异常

for循环中,Python 会自动处理StopIteration异常并优雅地停止。但如果你手动使用next(),请务必注意当元素耗尽时程序会报错。


6. 总结

  • 可迭代对象是可以被遍历的数据源。
  • 迭代器是遍历数据的工具,通过next()获取下一个值。
  • 生成器是构建迭代器最简单、最高效的方式,核心在于yield
  • 核心优势:通过“延迟加载”极大节省内存,提升处理大数据集时的性能。

进阶建议:
在接下来的编程实践中,尝试将原本返回大列表的函数改写为使用yield的生成器,你会发现代码不仅更简洁,运行也更加轻快。


资源推荐:

  • Python 官方文档 - 迭代器
  • Python 官方文档 - 生成器

感谢阅读!如果你觉得这篇文章对你有帮助,欢迎点赞并关注,我们下次见。

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

太空大脑:数字空间一号试验星如何实现空间智能计算

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 16:37:51

二手CPU物理损伤检测:从外观到压力测试的四级避险指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 16:37:20

十五、Tailwind CSS——插件、生态与工具

一、官方插件 官方插件由 Tailwind 团队维护&#xff0c;质量稳定、与核心版本同步。 1. typography 作用说明&#xff1a; tailwindcss/typography 提供 prose 系列类&#xff0c;一键排版富文本&#xff08;文章、博客、文档&#xff09;&#xff0c;自动处理好标题、段落、列…

作者头像 李华
网站建设 2026/9/2 16:36:40

性能测试:常见性能测试指标 -- 吞吐量

性能测试&#xff1a;常见性能测试指标 – 吞吐量 文章目录性能测试&#xff1a;常见性能测试指标 -- 吞吐量1. 事务2. 什么是吞吐量&#xff1f;3. 吞吐量案例3.1 A 场景3.2 B 场景3.3 区别&#xff1a;3.4 解释&#xff1a;为什么A场景会占用更多的系统资源4. 吞吐量分类&…

作者头像 李华
网站建设 2026/9/2 16:34:13

论文附录该放什么内容?按读者需求对比

写论文到收尾阶段&#xff0c;很多人卡在同一个问题上&#xff1a;附录到底该放问卷还是原始数据&#xff1f;附录放少了怕审稿人说材料不全&#xff0c;放多了又怕被批"凑页数"。其实附录怎么安排&#xff0c;答案不在"别人怎么放"&#xff0c;而在"…

作者头像 李华