Python 迭代器和生成器到底啥区别?3 个例子讲透,别再背概念了

简介: 迭代器和生成器不是并列关系——生成器是迭代器的一种“偷懒写法”。3 个例子讲透:迭代器是“会挨个吐值的对象”,生成器是用 yield 现写现用的那种,最大区别是它懒,要一个才生一个。

Python 迭代器和生成器到底啥区别?3 个例子讲透,别再背概念了

系列:Python 底层设计逻辑|类型:原理拆解型|分发:CSDN / 掘金 / 51CTO / 阿里云 / 知乎(回答)
字数:约 1600 字

结论先行:迭代器(iterator)和生成器(generator)不是并列关系——生成器是迭代器的一种"偷懒写法"。所有生成器都是迭代器,但迭代器不一定是生成器。一句话区分:迭代器是"会挨个吐值的对象"(实现 __iter__ + __next__),生成器是用 yield 或生成器表达式"现写现用"造出的那种迭代器,最大的不同是它懒,要一个才生一个,不占内存。


1. 先搞清:什么是迭代器

能 for x in obj 挨个取值的对象,都叫"可迭代对象"(iterable,有 __iter__)。而迭代器是"被迭代时记住自己走到哪"的那个东西——它多了个 __next__,每次调用吐下一个,吐完抛 StopIteration。

lst = [1, 2, 3]
it = iter(lst)          # list 是可迭代对象,iter() 造出它的迭代器
print(next(it))          # 1
print(next(it))          # 2

关键点:list 本身不是迭代器(它可被多次 iter()),但 it 是。for 循环干的事,本质就是反复 next() 直到 StopIteration。

2. 生成器:用 yield 写的迭代器

手写一个完整的迭代器类,要实现 __iter__ 和 __next__,还要自己存状态——挺啰嗦。生成器让你用 yield 把函数变成迭代器,状态由 Python 自动保存:

def gen():
    for i in range(3):
        yield i * i

g = gen()                # g 就是一个生成器对象(也是迭代器)
print(next(g))           # 0
print(next(g))           # 1
print(next(g))           # 4

为什么方便:yield 每次"暂停"把值交出来,下次 next() 从暂停处继续。你不用手动管下标、不用存列表,函数体就是状态机。

3. 核心差别:一个在内存,一个"现生现用"

这是最该记住的一点,用大文件举例:

# 迭代器(但提前把 100 万个平方全算好塞进列表)—— 占内存
def squares_list(n):
    return [i*i for i in range(n)]

# 生成器 —— 要一个才算一个,内存几乎为 0
def squares_gen(n):
    for i in range(n):
        yield i*i

for x in squares_gen(1_000_000):
    if x > 100:
        break

差别:列表版本先把一百万个数全造出来(几十 MB);生成器版本算到 x>100 就停,后面根本没算。这就是"懒求值"的价值——处理大文件、无限序列、流式数据时,生成器是刚需。

4. 生成器表达式:更短的写法

gen_expr = (i*i for i in range(1000000))   # 注意是 () 不是 []
print(next(gen_expr))                       # 0

对照:[] 是列表推导(一次性全算),() 是生成器表达式(懒)。一个占内存,一个不占,写法只差一对括号。

5. 生成器的"一次性"陷阱

迭代器和生成器都只能走一遍——走完就空了,得重新造:

g = squares_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 写的、懒的迭代器"。背概念不如记这句——要一个才生一个的,就是生成器。

相关文章
|
7月前
|
人工智能 Linux API
OpenClaw全自动小红书运营实战:从0到1全流程部署、技能配置与内容自动化发布指南
在内容自动化运营场景中,OpenClaw(Clawdbot)凭借高度可扩展的Skill体系与多任务执行能力,可实现从热点追踪、文案创作、封面生成到笔记发布、互动管理的全流程自动化。本文基于2026年最新环境,完整讲解如何通过阿里云轻量服务器或本地Windows11/macOS/Linux部署OpenClaw,安装并配置小红书运营Skill,完成Cookie登录、内容生成、笔记发布、数据监控,并接入阿里云百炼Coding Plan免费大模型与QMD记忆优化系统,实现低成本、7×24小时无人值守小红书运营。全文无营销词汇,所有命令可直接复制,零基础用户也能快速跑通全流程。
3395 9
|
6天前
|
弹性计算 网络协议 应用服务中间件
SSL 证书 90 天到期太频繁:三种自动续期方案横向对比
证书 90 天到期,忘了续站点就报警告。这篇把三条续期自动化路线摆在一起对比:自建服务器用 acme.sh 全自动续签、云产品上开阿里云证书托管、以及用 HTTPS 加速网关把证书交给平台。含可直接复制的 acme.sh 命令、托管的触发条件与限制、选型决策表和 8 条避坑点,读完能给自己站点定一套不会再漏的续期机制。
|
22天前
|
机器学习/深度学习 算法 前端开发
发动机故障诊断智能体(二):基础时序压缩与长短期记忆编码网络
在智能体完成气路多航段时序数据的采集与规整后,高维度的原始时序信号需要经过深度表征与降维处理,以消除高频测量噪声并提炼本质物理趋势。采用长短期记忆自编码器架构,在脱离人工标签监督的情况下,利用海量正常运行数据进行自监督重构训练,构建出能够压缩并表征发动机稳态工况与退化趋势的时序特征提取模型。
|
1月前
|
人工智能 安全 API
阿里云Token Plan 个人版Quick Start:最低39 元/月,主流AI工具直接接入,Credits 统一计量
阿里云百炼 Token Plan 个人版是面向个人开发者的 AI 大模型订阅服务,采用 Credits 统一计量,支持在 Claude Code、Cursor、Qwen Code 等主流 AI 编程和智能体工具中使用。目前提供 Lite、Standard、Pro 三档套餐及用量包,限时价格分别为 39 元/月、139 元/月、499 元/月。
阿里云Token Plan 个人版Quick Start:最低39 元/月,主流AI工具直接接入,Credits 统一计量
|
19天前
|
人工智能 JSON 测试技术
Agent 里为什么不该什么都交给大模型?Jev 给了一个新答案
Jev是TypeSafe AI于2026年9月推出的首款“系统级决策模型”,专为AI工程化设计:不生成文本,专注分类、路由、评分等结构化判断,输出带置信度的类型化决策(如“高风险:92%”)。它响应快、成本低,填补Agent/RAG/测试平台中高频轻量判断的空白,推动AI架构从“一模型通吃”走向分层协同。
|
1月前
|
算法 数据挖掘 Shell
经验自进化:自动挖掘经验资产,消融实验验证真实收益丨AgentLoop 数据飞轮实践(五)
本文介绍AgentLoop经验自进化实践:从运行轨迹自动挖掘成功与失败模式,经Skill召回并注入上下文。文章详解接入验证流程,并通过消融实验优化召回策略,降低耗时、成本、Token消耗和工具调用,让Agent持续迭代。
277 17
|
24天前
|
人工智能 Ubuntu 数据可视化
Ubuntu 本地部署Ollama+OpenWebUI教程
本文详解Ubuntu下零基础部署Ollama+OpenWebUI:一键安装Ollama(支持CPU/GPU)、拉取轻量qwen3.5:0.8b模型、虚拟环境隔离安装OpenWebUI、配置systemd自启服务,最终建成可远程访问、离线运行、稳定易用的本地AI对话网页。
385 2
|
27天前
|
JavaScript 开发者
DSH plugin 从零怎么写?最小插件目录、本地构建与装进 profile 调试的完整起步流程
写第一个 DSH plugin 只需要一个导出 apply 函数的模块:先用 patch 覆盖层把本地文件插进 Web 界面验证,再做成包用 dsh plugin --profile add 装进 profile,最后用 --dump-config 与日志排错。
208 2
|
1月前
|
人工智能 自然语言处理 监控
不止降本增效:AI智能客服如何成为企业业务增长新引擎
瓴羊Quick Service是阿里云推出的企业级智能客服平台,融合大模型与AI Agent技术,实现从“被动应答”到“主动服务+任务执行”的跃迁。支持多渠道接入、多模型灵活切换,AI问答准确率达93%,可自动查物流、改地址、催发货等,助力企业降本增效、转化销售、驱动决策,真正将客服升级为“增长引擎”。

热门文章

最新文章