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

张开发
2026/4/20 0:42:23 15 分钟阅读

分享文章

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是一款自动视频编辑工具可以将文本、文章或故事转换为视频。

更多文章