yield节省内存是因为将函数转为生成器,逐行生成数据而非一次性加载全部;避免readlines()内存爆炸;不可混用return value;生成器不可重用;生成器表达式更轻量但功能受限。

yield 能节省内存,是因为它让函数变成生成器——不一次性加载全部数据,而是在每次迭代时才产生下一行,用完即弃,内存里始终只存一行。
yield 如何避免 readlines() 的内存爆炸
调用 f.readlines() 会把整个文件按行拆成列表,所有字符串对象全驻留内存。10GB 日志 → 几 GB 内存占用,极易触发 MemoryError。yield 则绕过这一步:
- 打开文件后,
for line in f:本身已返回一个逐行迭代器,yield line.strip()只转发当前行,不缓存历史行 - 没有中间列表、没有副本、没有索引结构,连
len()都无法调用 - 哪怕文件有上亿行,内存占用基本恒定(约几 KB)
别在生成器里混用 return value
这是最常踩的坑:return "done" 不会把字符串传给调用方,而是直接抛出 StopIteration 异常,且异常对象的 value 属性才藏着那个字符串。调用方用 next(gen) 拿不到,用 for 循环则根本收不到。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 想传递状态?改用
yield ("status", "done")或yield {"type": "summary", "count": 12345} - 想提前终止?直接
return(无值)就行,等价于raise StopIteration - 生成器一旦被完全迭代完,就不可重用 —— 再次遍历必须重新调用函数创建新生成器
生成器表达式比 yield 函数更轻量,但适用场景不同
(x**2 for x in range(10**7) if x % 2 == 0) 这种写法比定义一个带 yield 的函数还省开销,适合简单过滤/变换;但它没法封装复杂逻辑(比如带状态的解析器、多文件轮转、数据库分页查询)。
- 需要复用状态(如累计行号、解析上下文)?必须用
yield函数 - 只是“对每个元素做固定操作”?优先选生成器表达式,代码更短,启动更快
- 两者都不能用索引访问(
gen[5]报错),也不能len(),这是懒加载的代价
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










