Python生成器嵌套太多?使用yield from秒变简洁!

news2024/7/6 18:02:53

目录

1、yield from基础概念 🌐

1.1 yield关键字回顾

1.2 yield from引入动机

2、yield from深入解析 🧭

2.1 语法与用法

2.2 传递生成器控制权

2.3 与迭代器的高效整合

2.4 与传统yield对比优势

3、实战应用示例 📈

3.1 链接多个生成器

3.2 简化递归生成器实现

3.3 复杂数据流处理

3.4 错误处理与异常传递

4、yield from在协程中的角色 🔄

4.1 协程基础与async/await

4.2 yield from与asyncio结合使用

4.3 异步IO处理实例

5、总结与展望 🚀



1、yield from基础概念 🌐

1.1 yield关键字回顾

生成器是Python中一种特殊的迭代器,允许函数在执行过程中保存状态 ,从而可以暂停并后续恢复执行。yield关键字是其核心,用于在函数中定义生成值的点。当函数遇到yield时 ,它会暂停执行并将控制权交还给调用者,同时返回yield后面的值。下一次调用生成器的__next__()方法或使用next()函数时 ,会从上次暂停的位置继续执行。

例如,简单的生成器函数如下所示:

def simple_generator():
    yield 1
    yield 2
    yield 3

gen = simple_generator()
print(next(gen))  # 输出: 1
print(next(gen))  # 输出: 2
print(next(gen))  # 输出: 3

1.2 yield from引入动机

随着Python的发展 ,为了解决生成器嵌套调用时的复杂性,以及更高效地委托生成器间的数据流动,yield from表达式在Python 3.3中被引入。它使得一个生成器可以将控制权直接传递给另一个可迭代对象(通常是另一个生成器),并且能够透明地传递数据和异常处理。这不仅简化了代码结构 ,还提高了代码的可读性和维护性。

使用yield from之前,手动委托可能涉及循环和显式发送异常,而yield from自动处理这些细节,使代码更加简洁。接下来的章节将会展示yield from的具体应用与优势。

2、yield from深入解析 🧭

2.1 语法与用法

yield from语句自Python 3.3起引入 ,它主要用作生成器间的委托,实现数据流的无缝传递。它提供了一种更简洁的方式来委托生成器到另一个可迭代对象,如另一个生成器、列表、元组等。这不仅简化了代码,还改善了性能 ,尤其是在处理嵌套生成器时。使用yield from可以将一个生成器内部直接“展开”另一个生成器的所有元素,无需显式循环。

示例代码:

def subgenerator():
    yield 'A'
    yield 'B'

def delegating_generator():
    yield from subgenerator()
    yield 'C'

gen = delegating_generator()
for value in gen:
    print(value)

输出:

A
B
C

2.2 传递生成器控制权

yield from的关键特性在于它能够将当前生成器的控制权完全传递给右边的可迭代对象。这意味着在内部生成器中通过yield产生的值会直接传递给外部调用outer_gen()的循环,而无需额外的循环结构。此外,如果内部生成器抛出异常,该异常也会直接传递给外部调用方,增强了错误处理的透明度。

def exception_gen():
    yield from range(3)
    raise ValueError("This won't be raised")  # 这里不会执行到

try:
    for value in exception_gen():
        print(value)
    print("No exception here")  # 控制流不会到达此行
except ValueError as e:
    print(e)  # 正确捕获内部生成器的异常

2.3 与迭代器的高效整合

yield from不仅限于与其他生成器的合作,它还能高效地整合任何可迭代对象,包括列表、字典、集合等。这使得编写处理复杂数据结构的生成器变得简单直观,同时保持了代码的高效率和低内存占用。

例如,合并多个列表为一个生成器:

def combined_gen(lists):
    for lst in lists:
        yield from lst

lists = [[1, 2], [3, 4], [5]]
for num in combined_gen(lists):
    print(num)  # 输出: 1, 2, 3, 4, 5

2.4 与传统yield对比优势

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么牌子的开放式耳机好?五大优质机型,新手必看!小白闭眼入系列

音乐技术的不断进步为耳机市场的发展有了更多的选择,开放式耳机成为音乐爱好者们新的一个选择。从最初的基础音质到如今的高解析度音频,开放式耳机经历了一次次的技术革新和升级。这类耳机以开放式不入耳的设计,舒适的佩戴体验著称&#xff0…

C语言实现的飞机票系统解析

前言 操作系统:Windows下运行。如果需要在Linux运行(单机版),则需要修改删除conio.h,自己写个头文件获取键盘输入。我已经写好了getch.h文件,需要将其导入使用。 开发环境:CodeBlocks || VS C…

界面组件DevExpress WinForms v24.1 - 支持DateOnly TimeOnly类型

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

嘀嗒出行项目管理专家和项目管理负责人王禹华受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 嘀嗒出行项目管理专家和项目管理负责人王禹华女士受邀为第十三届中国PMO大会演讲嘉宾,演讲议题为“AI时代项目经理挑战机会和个人成长”。大会将于6月29-30日在北京举办,敬请关注! 议题简要: AI时代对互…

Pyecharts入门

数据可视化 Pyecharts简介 Apache ECharts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时&#…

Vue下载接口返回流的处理

1.下载接口返回流如下: 2.可以写公共方法处理 excelDownload(obj, name Date.now(), suffix xlsx) {//Date.now()获取当前日期const url window.URL.createObjectURL(//Blob是二进制大对象new Blob([obj], { type: application/vnd.ms-excel }))const aDOM docu…

【一竞技LCK】夏季赛:HLE强势横扫2比0击败KT!

北京时间6月24日,LCK夏季赛在昨天结束了第二周最后一个比赛日的比赛。昨天第二场比赛是HLE战队迎战DK战队,本赛季DK战队的状态可以说是相当的低迷,在首轮比赛是被KDF战队给2比0横扫,昨天面对实力不俗的HLE战队也是落了下风&#x…

工程化视角的 Kotlin Multiplatform核心解读及优化

本篇为KMP技术的技术及实践系列文章的第二篇。在这篇技术文章中我们会以百人移动研发团队的工程化视角,探讨Kotlin Multiplatform的核心技术及优化。 Kotlin: 语言与编译 人们在用自然语言沟通时,内容可以不明确,甚至小的错误,而听…

【数学建模】—【Python库】—【Numpy】—【学习】

目录 ​编辑 1. NumPy安装 2. ndarray对象 1. 创建ndarray 1.从列表或元组创建: 2.使用内置函数创建: 2. ndarray属性 3. 数组运算 1. 基本运算 2. 数学函数 3.统计函数 4. 数组索引与切片 1. 一维数组索引与切片 2.多维数组索引与切片 5.…

Excel 宏录制与VBA编程 —— 16、InputBox函数的使用方式

Input函数基本操作 InputBox函数的Type参数使用技巧(输入类型限制,若输入类型不符系统提示) 关注 笔者 - jxd

山东大学-科技文献阅读与翻译(期末复习)(选择题+翻译)

目录 选择题 Chapter1 1.which of the following is not categorized as scientific literature 2.Which of the followings is defined as tertiary(三级文献) literature? 3.Which type of the following international conferences is listed as Number one conference…

【Redis】数据持久化

https://www.bilibili.com/video/BV1cr4y1671t?p96 https://blog.csdn.net/weixin_54232666/article/details/128821360 单点redis问题: 数据丢失问题:实现Redis数据持久化并发能力问题:搭建主从集群,实现读写分离故障恢复问题&…

jeecg导入excel 含图片(嵌入式,浮动式)

jeecgboot的excel导入 含图片(嵌入式,浮动式) 一、啰嗦二、准备三、 代码1、代码(修改覆写的ExcelImportServer)2、代码(修改覆写的PoiPublicUtil)3、代码(新增类SAXParserHandler&a…

算法设计与分析:并查集法求图论桥问题

目录 一、实验目的 二、问题描述 三、实验要求 四、算法思想 1. 基准算法 1.1 算法思想 1.2 代码 1.3 时间复杂度 2. 使用并查集的高效算法 2.1 算法思想 2.2 代码: 2.3 时间复杂度: 五、实验结果 一、实验目的 1. 掌握图的连通性。 2. 掌…

《代码大模型安全风险防范能力要求及评估方法》正式发布

​代码大模型在代码生成、代码翻译、代码补全、错误定位与修复、自动化测试等方面为研发人员带来了极大便利的同时,也带来了对安全风险防范能力的挑战。基于此,中国信通院依托中国人工智能产业发展联盟(AIIA),联合开源…

干货分享 | TSMaster 的 CAN UDS 诊断操作指南(下)

上期,我们主要介绍了 UDS 诊断模块的创建以及TSMaster 基础诊断配置。很多客户表示意犹未尽。因此我们将继续带来《TSMaster 的 CAN UDS 诊断操作指南(下)》的精彩内容,为您带来UDS on CAN/CAN FD 的功能以及详细的使用操作。 本文…

深入浅出:npm常用命令详解与实践

简介 在现代的软件开发中,特别是在 JavaScript 生态系统中,npm(Node Package Manager)是一个核心工具。它不仅仅是 Node.js 的包管理器,还扮演着项目依赖管理、脚本执行、项目发布等多重角色。理解 npm 的常用命令不仅…

【数据结构】线性表之《队列》超详细实现

队列 一.队列的概念及结构二.顺序队列与链队列1.顺序队列2.链队列 三.链队列的实现1.创建队列2.初始化队列3.入队4.出队5.获取队头元素6.获取队尾元素7.队列的大小8.队列的判空9.清空队列10.销毁队列 四.队列的盲区五.模块化源代码1.Queue.h2.Queue.c3.test.c 六.栈和队列必做O…

小白上手AIGC-基于FC部署stable-diffusion

AIGC AIGC(人工智能创造内容)作为一种基于人工智能技术生成内容的新型创作模式。打破了过去大家对于AI的理解都是说只能涉足部分领域而无法涉足艺术或者是其他的创作领域的定律,现在的AIGC也能够创作内容了,而不再只是单纯的返回…

MAC Address

文章目录 1. 前言2. MAC Address2.1 MAC 地址格式2.2 Locally Administered MAC Address2.3 MAC 单播 和 多播 3. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. MAC Address 2.1 MA…