首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
Python 迭代器和生成器到底啥区别?3 个例子讲透,别再背概念了
📅 2026/10/11 13:16:48
✍️ 爱科研究院
👁 阅读 3,247
结论先行迭代器iterator和生成器generator不是并列关系——生成器是迭代器的一种偷懒写法。所有生成器都是迭代器但迭代器不一定是生成器。一句话区分迭代器是会挨个吐值的对象实现__iter____next__生成器是用yield或生成器表达式现写现用造出的那种迭代器最大的不同是它懒**要一个才生一个不占内存。**1. 先搞清什么是迭代器能for x in obj挨个取值的对象都叫可迭代对象iterable有__iter__。而迭代器是被迭代时记住自己走到哪的那个东西——它多了个__next__每次调用吐下一个吐完抛StopIteration。lst[1,2,3]ititer(lst)# list 是可迭代对象iter() 造出它的迭代器print(next(it))# 1print(next(it))# 2关键点list本身不是迭代器它可被多次iter()但it是。for循环干的事本质就是反复next()直到StopIteration。2. 生成器用 yield 写的迭代器手写一个完整的迭代器类要实现__iter__和__next__还要自己存状态——挺啰嗦。生成器让你用yield把函数变成迭代器状态由 Python 自动保存defgen():foriinrange(3):yieldi*i ggen()# g 就是一个生成器对象也是迭代器print(next(g))# 0print(next(g))# 1print(next(g))# 4为什么方便yield每次暂停把值交出来下次next()从暂停处继续。你不用手动管下标、不用存列表函数体就是状态机。3. 核心差别一个在内存一个现生现用这是最该记住的一点用大文件举例# 迭代器但提前把 100 万个平方全算好塞进列表—— 占内存defsquares_list(n):return[i*iforiinrange(n)]# 生成器 —— 要一个才算一个内存几乎为 0defsquares_gen(n):foriinrange(n):yieldi*iforxinsquares_gen(1_000_000):ifx100:break差别列表版本先把一百万个数全造出来几十 MB生成器版本算到x100就停后面根本没算。这就是懒求值的价值——处理大文件、无限序列、流式数据时生成器是刚需。4. 生成器表达式更短的写法gen_expr(i*iforiinrange(1000000))# 注意是 () 不是 []print(next(gen_expr))# 0对照[]是列表推导一次性全算()是生成器表达式懒。一个占内存一个不占写法只差一对括号。5. 生成器的一次性陷阱迭代器和生成器都只能走一遍——走完就空了得重新造gsquares_gen(3)list(g)# [0, 1, 4]list(g)# [] ← 空了生成器已耗尽坑点把生成器当列表反复用第二次永远拿到空。需要重复遍历就转成 list或重新调用函数再造一个。对照表一眼分清维度可迭代对象迭代器生成器能否for✅✅✅有__next__❌需iter()造✅✅是否懒否看实现✅ 一定是写法list/str等手写类yield/()表达式遍历遍数无限次一遍一遍排错清单收藏级生成器第二次遍历是空它一次性重用时list()或重新调用函数。yield和return混用return在生成器里只用来结束并带值到StopIteration别当普通返回值。大列表爆内存把[... for ...]改成(... for ...)瞬间省内存。生成器里改外部变量小心它是惰性执行的循环体里的副作用会延迟到被next()时才发生。next()超界报StopIteration用for或在next(g, default)给默认值兜底。一句话记住迭代器是会走路的对象生成器是用 yield 写的、懒的迭代器。背概念不如记这句——要一个才生一个的就是生成器。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/11 13:16:48
OSBF综合实验:操作系统底层子系统性能基准测试实战
2026/10/11 13:16:48
bloub自定义指南:8种形状×12种颜色×16种表情,打造专属AI机器人头像
2026/10/11 13:16:48
企业级落地agent-beacon:Agent遥测转发到S3、Splunk、Datadog的部署清单
2026/10/11 14:16:52
Oracle 19c RAC Linux安装:内核调优、网络配置与ASM存储硬核指南
2026/10/11 14:16:51
常州工学院编译原理试卷A:可运行的编译器前端教学沙盒
2026/10/11 14:16:51
HIS系统数据结构手册怎么读?从.doc到可执行SQL的实战路径
2026/10/11 14:16:51
基于MTPA最大转矩电流比PMSM、双闭环矢量控制仿真模型(带参考学习资料)
2026/10/11 14:16:51
MySQL省市区SQL导入与查询实战:表结构、避坑与性能优化
2026/10/11 14:11:51
Android热修复机制:从原理选型到落地排障指南
2026/10/11 0:00:10
流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南
2026/10/11 0:00:10
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别
2026/10/11 0:00:10
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
2026/10/11 0:00:10
流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南
2026/10/11 0:00:10
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别
2026/10/11 0:00:10
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
2026/10/10 3:41:56
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/10 3:41:54
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/9 11:36:17
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)