当前位置: 首页 > news >正文

Python进阶必看:深入解析yield的强大功能

https://segmentfault.com/a/1190000045317342?utm_source=sf-similar-article

Python进阶必看:深入解析yield的强大功能
头像
涛哥聊Python
2024-10-22 四川
阅读 3 分钟
头图
大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。

更多Python学习内容:http://ipengtao.com

在Python编程中,yield关键字是一个非常强大且灵活的工具,它可以用来创建生成器函数。生成器函数与普通函数不同,它们不会一次性计算出所有结果,而是每次被调用时生成一个值,从而实现惰性求值(lazy evaluation)。这种特性使得yield特别适用于处理大量数据或实现流式处理。本文将详细介绍yield的概念、使用方法和实际应用场景,并提供相应的示例代码,帮助全面掌握这一重要工具。

什么是 yield?
yield关键字用于定义生成器函数。生成器函数在执行时会返回一个生成器对象,而不是像普通函数那样返回一个值。生成器对象是一个迭代器,可以在需要时生成一系列值。

生成器函数的特点
惰性求值:生成器在每次调用时生成一个值,而不是一次性生成所有值,这可以节省内存。
状态保持:生成器函数会记住上一次返回值时的状态,下一次迭代会从上次停止的地方继续执行。
无限序列:生成器可以用于生成无限序列,而不会占用大量内存。
基本用法
定义生成器函数
生成器函数使用yield关键字来生成值,而不是使用return。

def simple_generator():
yield 1
yield 2
yield 3

gen = simple_generator()

print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
在这个示例中,simple_generator函数是一个生成器函数,它依次生成1、2、3。next函数用于获取生成器的下一个值。

使用 for 循环遍历生成器
生成器对象是可迭代的,因此可以使用for循环来遍历生成器生成的值。

def simple_generator():
yield 1
yield 2
yield 3

for value in simple_generator():
print(value)
这个示例中,for循环遍历生成器函数生成的所有值,并依次打印它们。

生成器表达式
生成器表达式是一种简洁的生成器定义方式,类似于列表推导式,但使用圆括号代替方括号。

gen_expr = (x * x for x in range(5))

for value in gen_expr:
print(value)
这个示例中,生成器表达式生成了一个平方数序列,并使用for循环打印所有值。

yield 的高级用法
使用 yield 实现协程
协程是更高级的生成器,允许在生成值的同时接收外部数据。使用send方法可以向生成器发送数据,并在生成器内部使用yield表达式接收数据。

def coroutine():
while True:
received = yield
print(f"接收到的数据: {received}")

co = coroutine()
next(co) # 预激生成器
co.send(10) # 输出: 接收到的数据: 10
co.send(20) # 输出: 接收到的数据: 20
在这个示例中,coroutine生成器函数在每次迭代时接收外部数据并打印它。

实现无限序列
生成器特别适合生成无限序列,因为它们只在需要时生成值,不会占用大量内存。

def infinite_sequence():
num = 0
while True:
yield num
num += 1

gen = infinite_sequence()

for i in range(10):
print(next(gen))
在这个示例中,infinite_sequence生成器函数生成了一个无限整数序列。for循环限制为打印前10个值。

实际应用场景
读取大文件
使用生成器读取大文件可以避免将整个文件加载到内存中,从而节省内存。

def read_large_file(file_path):
with open(file_path, 'r') as file:
while True:
line = file.readline()
if not line:
break
yield line

for line in read_large_file('large_file.txt'):
print(line, end='')
在这个示例中,生成器函数read_large_file逐行读取大文件,并使用for循环打印每行内容。

实现管道处理
生成器可以用于实现数据处理管道,每个生成器函数负责一个处理步骤。

def pipeline_stage1(data):
for item in data:
yield item * 2

def pipeline_stage2(data):
for item in data:
yield item + 1

data = range(5)
stage1 = pipeline_stage1(data)
stage2 = pipeline_stage2(stage1)

for value in stage2:
print(value)
在这个示例中,数据经过两个生成器函数处理,首先在pipeline_stage1中乘以2,然后在pipeline_stage2中加1。

注意事项
使用 try-finally 块进行清理
在生成器中,可以使用try-finally块确保在生成器结束时进行必要的清理操作。

def generator_with_cleanup():
print("生成器开始")
try:
yield "Hello"
finally:
print("生成器结束")

gen = generator_with_cleanup()
print(next(gen))
gen.close() # 触发 finally 块
这个示例展示了如何在生成器中使用try-finally块进行清理操作。

异常处理
生成器中可以使用try-except块处理异常。

def generator_with_exception_handling():
try:
yield 1
yield 2
raise ValueError("发生错误")
yield 3
except ValueError as e:
print(f"捕获异常: {e}")

gen = generator_with_exception_handling()

for value in gen:
print(value)
在这个示例中,生成器函数在发生异常时捕获并处理异常。

总结
本文详细介绍了Python中yield关键字的概念和用法。通过yield,可以创建强大的生成器函数,实现惰性求值和状态保持,使得处理大数据和流式数据更加高效。文章涵盖了基本用法、生成器表达式、协程、无限序列的生成,以及实际应用场景,如读取大文件和实现数据处理管道。还展示了如何在生成器中进行异常处理和资源清理。掌握这些技巧,可以帮助大家编写更简洁、高效的Python代码,提高程序的性能和灵活性。

相关文章:

Python进阶必看:深入解析yield的强大功能

https://segmentfault.com/a/1190000045317342?utm_source=sf-similar-article Python进阶必看:深入解析yield的强大功能 头像 涛哥聊Python 2024-10-22 四川 阅读 3 分钟 头图 大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。 更多Python学习内容:http://ip…...

polyglot,一个有趣的 Python 库!

https://segmentfault.com/a/1190000045317129 polyglot,一个有趣的 Python 库! 头像 涛哥聊Python 2024-10-02 四川 阅读 4 分钟 头图 大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。 更多Python学习内容:http://ipengtao.com 今天为大家分享一个有趣的 Py…...

个人介绍与博客初建

大家好!我是 李祺,很高兴能通过博客园这个平台和大家交流。我是一名计算机相关专业的学生,在平时生活里,音乐、旅途和美食是三大支柱。耳机里永远循环着不同语言的旋律:华语流行的细腻歌词、K-pop 的强劲节奏、英文歌的叙事感,都能让我在忙碌时快速切换状态。 旅游是我探…...

PySimpleGUI,一个神奇的 Python 库!

https://segmentfault.com/a/1190000045317132?utm_source=sf-similar-article#item-3-3 大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。 更多Python学习内容:http://ipengtao.com 今天为大家分享一个神奇的 Python 库 - PySimpleGUI。 Github地址:https://…...

c++ 的拷贝构造函数

当类成员变量有指针类型的时候,要自定义拷贝函数,不要使用默认的拷贝构造函数.因为默认的拷贝构造构造函数是浅拷贝是位拷贝的,只拷贝指针指向的空间而没有把空间里的内容一起拷贝过来,这样会导致改变其中的一个,另一个也会跟着一起改变(老婆也都一样的了)class Teacher{ publi…...

变异

n可以理解成特征的对比 是的,完全可以这么理解!✅ 一句话总结:n 就是“你用多少种不同的视角/特征去衡量这两段区间的关系”。✅ 举个例子: 你把两条 150 kb 区间(X 和 Y)拿来比较,可以问:视角(特征) 具体问法 对应通道覆盖度视角 “X 和 Y 哪边 reads 更多?” read…...

【笔记】类欧几里得算法

类欧几里得算法(之后或许会加上万欧)直接用例子开始吧: \[给定 a,b,c,n,求解\sum_{i = 0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor \]我们记 \(f(a,b,c,n) = \sum_{i = 0}^n\left\lfloor\frac{ai+b}{c}\right\rfloor\) 首先考虑 \(a \ge c\) 或 \(b \ge c\) 的情况: 先…...

AQS的一些思考

AQS-AI问答AQS是怎么实现CountDown AQS 为 CountDownLatch 提供了核心的 状态管理(state 作为计数器) 和 线程排队 / 唤醒机制(CLH 队列):通过 tryAcquireShared 检查计数器是否为 0,决定线程是否需要等待; 通过 tryReleaseShared 原子递减计数器,当计数器归零时唤醒所…...

DearPyGui-最强大的一款Python GUI工具

https://zhuanlan.zhihu.com/p/200754892 其实,在Python中不乏知名的UI构建工具包,例如,Tkinter,PyQT / PySide,wxPython,Kivy,PySimpleGui。这些工具包都很强大,但是,也非常繁琐。 开发一个框架要付出的精力和代码量几乎和核心逻辑相差无几,这与Python崇尚的简单是相…...

2 模型评估与选择

目录P18P23P25 P18 可以好好想一下ROC曲线是如何形成的:我们设置不同的二分类的阈值,就会有不同的(TPR,FPR)对;如果我们将所有数据按照其置信度从大到小排序,然后让阈值逐渐减小,并在ROC曲线上进行描点,那么我们可以发现,如果遇到一个正例,那么当前点会竖直向上走\(\fr…...

TY-290ES计算器屏幕逆向

刷拼多多时看到个便宜的TY-290ES计算器,到手价只需要人民币11块多,还是个点阵屏,真是难以想象国产计算器能做这么便宜,买一个来研究下。廉价小商品大本营(浙江)发的货,,,先点亮看看,功能很少,比82ES还差点意思。屏幕点阵粗略估了下,应该是96x31像素的,顶部有一行图标…...

CF1559E

时间限制 \(2\,\text{sec}\) 空间限制 \(256\,\text{MB}\) 题目来源 CodeForces。 题目大意 给定 \(n\) 个区间 \([l_i,\, r_i]\) 和一个常数 \(m\) ,在每个区间内选出一个正整数 \(a_i\) 构成一个数列 ,满足\(\displaystyle\sum^{n}_{i=1}a_i \leq m\) , \(\gcd \{a_i \} …...

笔记 哈希

A - Description 给定字符串 \(S\) 和 \(T\),问你在 \(S\) 中 \(T\) 出现了几次。 \(1\le |S|,|T|\le 2\times 10^6\) A - Solution 首先暴力地来想。在 \(S\) 中找出所有长度为 \(|T|\) 的子串,然后暴力逐字符匹配,复杂度显然是 \(O(n^2)\) 的,考虑优化。(此处假设 \(|T|…...

题解:CF566A Matching Names

题意 有 \(n\) 名同学,每位同学有一个真名与一个笔名,都是一个由小写英文字母组成的字符串。每位同学可以选择一位同学,使自己的真名与那位同学的笔名相匹配,产生的贡献为其最长公共前缀,每位同学的笔名只能与一人匹配,求贡献总和的最大值。 思路 把笔名插入字典树,并在…...

Tarjan 求连通性相关

复健发现自己对于 Tarjan 的一些东西都有些搞不清了啊。整理一下。 如有错误/不足,欢迎指出。 先给一些定义:\(u\) 表示某个子树的根节点。 \(v\) 表示与 \(u\) 相连的点。如果是无向图那么不包含父亲。 \(fa\) 表示 \(u\) 在 DFS 生成树上的父亲节点。 \(dfn_u\),表示 \(u\…...

暑假学习笔记

Hadoop 生态:实时 + 离线一体化 Flink on YARN 初体验 使用 Flink 1.17.1 提交 yarn-session 模式,队列 queue.stream 独享 4G 堆、2 vcore;编写 Kafka → Hive 的流式入湖作业,消费 user_behavior Topic,Checkpoint 30 s,Exactly-Once 写入 Hive 表 ods_log_rt,实现分钟…...

qoj #8557. Goldberg Machine 题解

有意思原题:https://qoj.ac/problem/8557 弱化版:https://www.luogu.com.cn/problem/P7830 但是弱化版要求做到更优复杂度,但是没有修改。 本文的 参考文章钦定树以 \(1\) 为根。钦定所有点 \(u\neq 1\) 的 \(e,t\) 循环位移成 \(e_{u,k_u-1}=fa_u\),就是把父亲丢到最后。 …...

centos7云主机磁盘清理过程纪要

云主机总磁盘大小为120G,在阿里云控制台配置了磁盘使用达90%告警 1. 收到告警短信 2. 当前磁盘占用情况 df -h | grep dev 已达到 89% 3. 开始排查 3-1. 查看哪个目录占用最大 du -sh /* 或者 du -sh /* | sort -h 发现 /www 目录占用 69G 3-2. 查看 /www du -sh /www/* /ww…...

『随笔』我的唱歌练习史

继续加油!因为热爱。...

2025浙江省信息通信业职业技能竞赛-数据安全管理员竞赛-决赛wp

通信证-签到flag{data_security_is_very_interesting}数据加密与解密-KeekKey题目描述:在数据安全领域,弱密钥和不安全的加密方式如同数字世界的 "隐形杀手",可能引发严重安全漏洞,威胁个人、企业甚至国家网络安全。如金融交易系统使用弱密钥,会被黑客暴力破解篡…...

Java基础核心问题解析

Java基础核心问题解析:方法、数组与类的深度探讨 在Java学习过程中,方法参数传递、数组特性、类与对象的关系等是基础且核心的知识点,也是容易产生困惑的地方。本文将围绕课前提出的一系列问题,逐一解析,帮助大家深入理解这些概念。 一、方法相关问题解析 先看这段代码,我…...

2025年浙江省信息通信业职业技能竞赛-数据安全管理员竞赛-初赛WriteUp

数据传输-网恋需谨慎:你是一个管理员,在一个名为orwell.freenode.net的服务器上结识了用户RiotCard85,RiotCard85主动联系了你,询问近况并提到他最近在做一个项目想让你看看。项目中隐藏了一些有趣的信息和内容,不幸的是黑客截获了你们的的网恋聊天记录,请分析找出RiotCa…...

九三阅兵实时记录+次日补

激动啊!情绪有点激动。...

铸网-2025”山东省工业互联网网络安全职业技能竞赛wp(职工组)

ICS失窃的工艺下载后test.PCZ文件,需要使用力控软件打开。但电脑没有安装这个软件,尝试把后缀名改为.zip,解压后直接搜索flag文本:成功在文件中找到flag:flag{D076-4D7E-92AC-A05ACB788292}。工控协议分析WireShark打开分析,追踪TCP流,flag被逐字符藏在流量中:拼凑起来…...

视洞R33定制版改造自制IPC网络摄像头(可rtsp可web)

这期的主角是视洞R33智能摄像头,LT定制版。我们通过修改启动命令让它运行开放系统,并且搭建rkipc平台,通过WEB/VLC预览视频画面 硬件配置很高啊,主控使用RV1106G2(带0.5T NPU),传感器gc4023,宽视角分辨率2560x1440@30fps,实测4M分辨率能跑满。能连WiFi,支持双向对讲、红…...

二十一、流水线的冒险与处理

目录总览:冒险的类型1. 结构冒险 (Structural Hazard)2. 数据冒险 (Data Hazard)3. 控制冒险 (Control Hazard)总结表流水线的冒险(Hazard)是破坏流水线顺畅执行,导致流水线不得不停顿(Stall)或清空(Flush)的主要因素。处理这些冒险是流水线设计的核心挑战。我们将详细…...

java线程的一些思考

java线程AI问答join是怎么实现的 1.join() 方法被 synchronized 修饰,意味着当前线程调用 t.join() 时,必须先获取目标线程 t 的对象锁(即进入 t 的同步代码块)。 2.方法内部通过 while (isAlive()) 循环检查目标线程是否存活: -若存活,当前线程调用 wait(0)(在目标线程…...

2025智能数据分类分级产品选型指南:构建数据治理的智能基座

2025智能数据分类分级产品选型指南:构建数据治理的智能基座在《数据安全法》《个人信息保护法》以及《数据安全技术 数据分类分级规则》(GB/T 43697-2024)等法规标准的推动下,数据分类分级已从“可选项”变为企业数据安全治理的“必答题”。面对金融、运营商、政务等行业中…...

这是我的第一个博客

这是我的第一个博客...

3

12...

eqw

qwe...

第一个c语言项目

1.打开vs 2.创建项目 3.创建源文件 .c 源文件 .h 头文件 注意后缀: .cpp 编译器会按照C++语法来编译代码 .C 编译器会按照C语言来编译代码 4.写代码 C语言一定要有(主函数)main函数 C语言规定:main函数是程序的入口 一个工程中nain函数有且仅有一个 include.h s…...

GitHub Copilot 2025年8月最新更新!

GitHub Copilot 2025年8月最新更新!GitHub Copilot迎来2025年8月重大更新,新增自动模型选择功能,可根据可用性智能匹配最优AI模型,提升开发效率。安全方面增加敏感文件编辑确认机制,同时优化了代理工作流程和终端自动批准功能。更新还支持AGENTS.md文件指导团队协作,并改…...

NOIP 模拟赛十五

Ds+计数DP+计数DP/容斥+根号重构range 将所有值以及除以二所能得到的所有值插入一个数据结构里,如果变为 \(0\) 就停止。 那么答案即为第 \(m+1\) 大的值减去第 \(m\) 大的值和前缀最小值取 \(\min\) 的差。 维护这个使用权值树状数组做到小常数 \(O(n\log^2 n)\) 。 注意查排…...

面试必备进程调度:fg,bg,jobs,ctrl+z,

面试必备进程调度:fg,bg,jobs,ctrl+z,& linux提供的fg和bg命令,可以让我们轻松调度正在运行的任务 假如你发现前天运行的一个程序需要很长的时间,但是需要干前天的事情,你就可以用ctrl-z挂起这个程序,然后可以看到系统的提示: [1]+ Stopped /root/bin/rsync.sh然后我们…...

完整教程:计算机毕设 java 多媒体教室管理系统 基于 Java+SSM 的多媒体教室运维平台 Java+MySQL 的教室预约与设备管理系统

完整教程:计算机毕设 java 多媒体教室管理系统 基于 Java+SSM 的多媒体教室运维平台 Java+MySQL 的教室预约与设备管理系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…...

笔记一

大家好!我是一名计算机相关专业的学生,平常做的最多的事情就是坐在电脑前敲代码解决各种 “小难题”。但写代码让我养成了 “遇到问题不逃避” 的思维,毕竟调试 BUG 时,多试一次可能就会有新突破。 说到值得分享的记忆,那就是我对于一些体育项目的热衷,比如打排球比赛,你…...

二十、指令流水线的基本实现

目录一、设计原则 (Design Principles)二、逻辑结构 (Logical Structure)三、时空图表示 (Space-Time Diagram Representation)总结一、设计原则 (Design Principles) 流水线的设计遵循几个核心原则,以确保其正确性和高效性。任务分解 (Decomposition)原则: 将指令的完整执行…...

物料模板匹配成功后,自动跟随的逻辑

问题简介 在对物料进行模板匹配时,往往是去匹配物料最突出的部分。然后在根据匹配到的位置。再去找我们需要测量或者检测部分。那么,这里就涉及到一个问题。该如何根据我们模板匹配到的特定位置,计算偏差值,并进行一些测量工具(卡尺,ROI)的跟随移动。 获取相对位置 此处…...

TCL t508n 关闭电话语音王提醒/改用4G

先吐槽一波( TCL的系统真的比原生还毛坯,到目前为止部分功能没有完善由于学业压力本文缺少部分图片说明,请见谅改用4g 打开拨号界面输入 ##4636## 设置首选网络类型 NR就是5G ,LTE是4G,WCDMA 3G 只用4g就选择LTE only 按照自己的需求选择 https://pic1.imgdb.cn/item/68c5…...

完整教程:Markdown 编辑器 语法

完整教程:Markdown 编辑器 语法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...

天地图的带洞多边形操作

/** 往 polygon 中添加一个洞 */ function addHole(polygon: T.Polygon) {const handler = new T.PolygonTool(map)handler.open()handler.addEventListener(draw, ({ currentPolygon }) => {const oldLnglats = polygon.getLngLats()map.removeOverLay(currentPolygon)poly…...

k8s集群中一台etcd的pod异常

k8s集群中一台etcd的pod异常 记一次etcd报错2380bind already in use杀掉容器依然无效 起初通过命令:kubectl get pod -n kube-system 发现etcd容器异常在主节点通过kubectl logs查看pod日志发现很明显的报错端口被占用当时查看2380端口确实有在占用通过nerdctl stop指令试着停…...

深入解析:基于51单片机电子称称重压力检测阈值报警系统设计

深入解析:基于51单片机电子称称重压力检测阈值报警系统设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New",…...

手撕大模型|KVCache 原理及代码解析

在大型语言模型(LLM)的推理过程中,KV Cache 是一项关键技术,它通过缓存中间计算结果显著提升了模型的运行效率。本文将深入解析 KV Cache 的工作原理、实现方式,并通过代码示例展示其在实际应用中的效果。 一、为什么需要 KV Cache? 在 Transformer 进行自回归推理(如文…...

Kuby免疫学读书笔记01——造血干细胞

造血干细胞(HSC, Hematopoietic stem cell) 血细胞的起源造血干细胞位置骨髓(主要) 脾和肝(少量)分裂与分化正常状态多部份沉默 小部分分裂并分化 分裂得到的daughter cells部分依旧保持分裂分化潜力 另一部分分化为祖细胞,自我更新能力下降,并更倾向于分化为血细胞感染状态和…...

微信群机器人开发

使用微信云pad协议来开发微信机器人,可以开发的项目很多,例如一些娱乐机器人、云发单系统,私域流量的智能管理和营销拓客,还有一些自动采集和发朋友圈的云端系统等。每个行业都有需求这样的系统应用,在线教育、金融、电商已经一些个人微商应用。 可开发的功能包括但不限于…...

动态规划和马尔可夫决策对比

二、三大关键维度的效果对比 1. 问题适配性:动态规划适配 “简单线性流程”,MDP 适配 “复杂网状流程” 动态规划的优势在于 “处理线性、低维度的多阶段决策”,MDP 的优势在于 “处理多维、网状的动态决策”,二者在论文场景中的适配效果差异显著:动态规划在问题二中的适配…...

20250913 之所思 - 人生如梦

20250913 之所思这一周发生了太多的事,连续两晚彻夜失眠,咳嗽不止,但是工作又特别忙,没有时间和精力来复盘,今天身体稍微恢复了一点,好好整理一下9.9日晚上十点,软件刚刚发出来,同事们刚刚下班,结果某人说客户那边今天测试发现了两个严重的问题,一定要今天解决,并且…...

电视剧和综艺

综艺团建不能停电视机春色寄情人 爱情剧...