本文深入解析 python 3 中生成器的构建方式与实际运用,全面阐述 yield 关键字的核心机制,并系统介绍生成器对象所支持的内置方法——send()、close() 和 throw(),助力开发者掌握其在真实项目中的灵活操控与高效实践。
1、 创建生成器最常见的方式是定义含 yield 的函数,但更简洁的途径是采用生成器推导式,比如通过 gen1 这类表达式即可快速构建。
2、 尽管其语法形式与列表推导式高度相似,但二者在运行行为上存在本质差异,下文将结合执行结果展开对比说明。

3、 执行对应代码后,输出结果如下所示:
立即学习“Python免费学习笔记(深入)”;
4、 列表推导式会在创建时立即完成全部元素的计算并存入内存。
5、 相比之下,生成器采用惰性求值策略:仅当被迭代(如进入 for 循环)时,才按需逐个生成并返回值。

6、 对于逻辑较复杂的场景,通常需要编写类函数结构的生成器,如图中所示。
7、 yield 的作用是暂停当前生成器的执行流程,并向外返回一个值;下次调用时从中断处继续运行;而 return 则会彻底终止生成器,引发 StopIteration 异常。yield 返回的值可通过迭代获取,return 后的内容则不可见。
8、 多数生成器会在生命周期内多次触发 yield,实现连续产出。
9、 图中分别调用 gen_prime(50) 与 gen_prime(100),生成两个独立的生成器实例,随后由 for 循环依次提取其中的质数值,直至所有数据耗尽。

10、 调用生成器函数后,并不会立即执行函数体,而是返回一个生成器对象,该对象具备按需产生数据的能力。
11、 除使用 for 循环遍历外,也可借助 next() 函数手动获取下一个 yield 值,如图所示。
12、 某些生成器设计为无限产出,例如质数生成器,理论上可源源不断地输出符合条件的新数值。
修正说明:1,实现真正的软件开源。2,安装界面的美化3,真正实现栏目的递归无限极分类。4,后台添加幻灯片图片的管理,包括添加,修改,删除等。5,修正添加新闻的报错信息6,修正网站参数的logo上传问题7,修正产品图片的栏目无限极分类8,修正投票系统的只能单选问题9,添加生成静态页功能10,添加缓存功能特点和优势1. 基于B/S架构,通过本地电脑、局域网、互联网皆可使用,使得企业的管理与业务不受地域


13、 若使用的是无限生成器,则需在适当时机主动调用 close() 方法来显式终止其运行,防止资源持续占用。
14、 一旦调用 close(),该生成器即进入关闭状态,后续再调用 next() 将直接抛出 StopIteration;for 循环也会随之自然退出。

15、 当需让生成器在运行中主动抛出指定异常并中断执行时,可使用 throw() 方法,其具体调用方式参见图示。

16、 生成器不仅可向外输出数据,还能在迭代过程中接收外部传入的信息。接下来以 DNA 转录程序为例,直观展示这一双向通信能力。
17、 注意红框部分代码:yield 实际上是一个表达式,它不仅能暂停执行并返回值,还能接收外部通过 send() 传入的数据,并将该值赋给变量 base,作为 yield 表达式的运算结果,驱动后续逻辑执行。

18、 我们预先构造了一段 DNA 序列字符串,基于此创建了输入生成器 DNAgen,再将其传入 transcriber() 函数,获得转录生成器 tbr,为后续碱基配对转换提供基础支撑。
19、 如图所示代码完成了 DNA 转录过程的模拟。通过调用 tbr.send() 向生成器注入单个碱基,等效于一次 next() 操作,同时获取对应的 RNA 碱基输出。下方展示了完整的转录结果。

20、 生成器拥有广泛的实际应用场景:例如利用其惰性特性,可逐行读取超大文本文件,避免一次性加载导致内存崩溃;亦可通过多层生成器嵌套搭建数据处理流水线,实现模块化、低耦合、高效率的数据流操作,显著增强程序的性能表现与工程可维护性。










