0

0

Python怎么使用生成器(generator)和yield_生成器与yield关键字深度解析

尼克

尼克

发布时间:2025-09-14 12:21:01

|

845人浏览过

|

来源于php中文网

原创

生成器通过yield实现惰性求值,按需生成值而不一次性加载所有数据,提升内存效率。调用生成器函数返回迭代器对象,每次next()触发函数执行至yield暂停并返回值,状态得以保留,后续调用继续执行。与普通函数立即返回并销毁状态不同,生成器可多次暂停与恢复,适合处理大规模序列。生成器表达式(如(x*x for x in range(n) if x%2==0))提供简洁语法,避免显式函数定义,适用于简单过滤或转换场景,兼顾代码清晰与性能优化。

python怎么使用生成器(generator)和yield_生成器与yield关键字深度解析

Python中的生成器(generator)和

yield
关键字是处理序列数据,尤其是大规模或无限序列时的强大工具。简单来说,生成器是一种特殊的迭代器,它允许你按需生成值,而不是一次性在内存中创建所有值。
yield
关键字是定义生成器函数的标志,它不像
return
那样终止函数执行,而是暂停函数,保存其状态,并在下次调用时从上次暂停的地方继续执行。这使得处理大量数据时,内存效率大大提升,也让代码逻辑更加简洁。

解决方案

生成器通过

yield
关键字工作。当一个函数包含
yield
语句时,它就变成了一个生成器函数。调用这个函数并不会立即执行其内部代码,而是返回一个生成器对象(一个迭代器)。当你对这个生成器对象调用
next()
方法(或者在
for
循环中使用它)时,函数体才会开始执行,直到遇到第一个
yield
语句。此时,
yield
后面的值会被“生成”并返回,而函数的状态(包括局部变量和执行位置)会被冻结。下次再调用
next()
时,函数会从上次
yield
暂停的地方继续执行,直到遇到下一个
yield
或函数结束。如果函数执行完毕没有更多的
yield
,就会抛出
StopIteration
异常,标志着迭代的结束。这种“惰性求值”的机制,是我个人认为它最迷人的地方,因为它彻底改变了我们处理数据流的方式。

def simple_generator():
    print("开始生成...")
    yield 1
    print("生成了1,继续...")
    yield 2
    print("生成了2,即将结束...")
    yield 3
    print("生成器函数执行完毕。")

# 创建生成器对象
gen = simple_generator()

# 逐个获取值
print(next(gen)) # 输出:开始生成... 1
print(next(gen)) # 输出:生成了1,继续... 2
print(next(gen)) # 输出:生成了2,即将结束... 3

try:
    print(next(gen))
except StopIteration:
    print("所有值都已生成,迭代结束。")

为什么生成器在处理大数据时如此高效?

生成器之所以在处理大数据时显得格外高效,核心在于它的“惰性求值”特性。它不会一次性将所有数据加载到内存中,而是根据需要,逐个或分批地生成数据。这与列表(list)等数据结构形成了鲜明对比,列表在创建时就需要将所有元素都存储在内存中。想象一下,如果你要处理一个包含数十亿行数据的日志文件,如果尝试将其全部读入一个列表中,你的系统内存很可能瞬间就会耗尽。而使用生成器,你可以一行一行地读取、处理,然后丢弃已处理的行,内存占用始终保持在一个可控的低水平。我曾经在处理一些大型CSV文件时深有体会,普通的文件读取方式常常导致内存溢出,但改用生成器后,问题迎刃而解,而且代码也变得更清晰。

生成器函数与普通函数在使用上有什么关键区别?

生成器函数与普通函数最核心的区别在于它们的返回值和执行流程。普通函数在执行到

return
语句时,会返回一个值并彻底终止函数的执行,其内部的所有局部变量和状态都会被销毁。而生成器函数遇到
yield
语句时,它会“暂停”执行,返回
yield
后面的值,但并不会终止。它的局部变量和执行状态会被保存下来。下次对生成器对象调用
next()
时,函数会从上次
yield
暂停的地方继续执行,直到遇到下一个
yield
或函数结束。

立即学习Python免费学习笔记(深入)”;

Cliclic AI
Cliclic AI

Cliclic商品背景图编辑器是一款功能强大的AI工具,帮助用户快速生成具有吸引力的商品图背景。

下载

这意味着,普通函数只执行一次,返回一个结果;而生成器函数可以被多次“恢复”执行,每次返回一个结果,直到所有结果都生成完毕。这种“可暂停、可恢复”的特性,让生成器非常适合用于迭代器模式的实现,尤其是当序列的完整内容无法或不应一次性计算出来时。

如何利用生成器表达式简化代码?

生成器表达式提供了一种简洁、优雅的方式来创建生成器,它的语法与列表推导式非常相似,只是将方括号

[]
替换为圆括号
()
。这种语法糖让生成器的创建变得非常直观,尤其是在需要对现有可迭代对象进行转换或过滤时。它本质上就是创建了一个匿名生成器函数,省去了显式定义函数的步骤。

例如,如果你想处理一个大文件中的数字,并只对其中的偶数进行某种操作,使用生成器表达式可以这样写:

# 假设有一个非常大的数字序列
# large_numbers = range(100000000) # 这是一个生成器,本身就惰性

# 使用生成器表达式处理
even_squares = (x * x for x in range(100000000) if x % 2 == 0)

# 现在 even_squares 是一个生成器对象,不会立即计算所有平方
# 我们可以按需迭代它
for _ in range(5):
    print(next(even_squares))

# 输出:
# 0
# 4
# 16
# 36
# 64

这里

even_squares
并不是一个包含所有偶数平方的列表,而是一个生成器。它只在每次
next()
被调用时,才计算下一个符合条件的偶数的平方。这在代码可读性和内存效率上都达到了很好的平衡。我个人觉得,对于简单的数据转换或过滤场景,生成器表达式比定义一个完整的生成器函数更加“Pythonic”,也更符合快速原型开发的习惯。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

550

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

45

2026.01.06

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

114

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

99

2025.11.13

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

36

2025.12.30

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号