Python yield关键字原理_生成器执行机制

yield 将函数变为生成器工厂,调用返回生成器对象而非执行函数体;首次 next() 启动执行,遇 yield 暂停并保存状态,后续 next() 从中断处继续,直至 StopIteration。yield 不是简单地"暂停函数",而是让函数变成生成器工厂------调用它不执行代码,只返回一个生成器对象;真正执行从第一次 next() 开始,遇到 yield 就交出值并挂起,保存全部局部状态(变量、执行位置、栈帧);下次继续从挂起点向下运行,直到下一个 yield 或函数结束抛出 StopIteration。yield 如何把普通函数变成生成器定义含 yield 的函数时,Python 解释器自动将其标记为 generator function。此时调用该函数(如 gen = my_func())不会运行函数体,而是立即返回一个 generator object。这个对象实现了迭代器协议(有 iter 和 next 方法),但内部尚未开始执行。生成器对象是惰性的:不调用 next(gen) 或用 for 循环触发,函数体一行都不会执行函数中只要出现 yield(哪怕还有 return 或在条件分支里),整个函数就属于生成器函数return 在生成器中可用于提前终止,并可带一个值(该值成为 StopIteration.value,但不会被 for 循环捕获)每次 next() 发生了什么首次调用 next(gen),解释器才真正进入函数体,逐行执行,直到遇到第一个 yield 表达式。此时:-- 计算 yield 右侧的值(如 yield x * 2),作为本次迭代的返回值-- 函数暂停,所有局部变量、指令指针、调用栈信息被完整保存在生成器对象内部-- 控制权交还给调用方后续每次 next(),都从上次暂停的位置继续执行(不是重新开始)如果遇到下一个 yield,流程同上;如果执行到函数末尾或碰到 return,则抛出 StopIteration 异常生成器对象内部维护一个状态机(GEN_CREATED → GEN_RUNNING → GEN_SUSPENDED → GEN_CLOSED),确保挂起/恢复语义严格可靠yield 表达式本身可接收外部传入的值当使用 gen.send(value)(而非 next())时,传入的 value 会成为上一次 yield 表达式的返回值。这使得生成器具备双向通信能力: Tellers AI Tellers是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。

相关推荐
Decay__26 分钟前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
代码山河3 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行3 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
梯度下降者3 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
小徐不徐说5 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
“AI国潮设计-小江”5 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
论文复现现场5 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
benchmark_cc6 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读6 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python
Decay__6 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构