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

目录

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 3gen = 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 lstlists = [[1, 2], [3, 4], [5]]
for num in combined_gen(lists):
    print(num)  # 输出: 1, 2, 3, 4, 5

2.4 与传统yield对比优势

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

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

相关文章

Git之checkout/reset --hard/clean -f区别(四十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Elasticsearch:倒数排序融合 - Reciprocal rank fusion - 8.14

警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。语法可能会在正式发布之前发生变化。Elastic 将努力修复任何问题,但技术预览中的功能不受官方正式发布功能的支持 SLA 约束。 倒数排序融合 (reciprocal rank fusion - RRF) 是一…

OpenAI: 禁止在不支持的地区使用其 API

OpenAI 给开发者发邮件表示,禁止其 API 用于不被允许的地区,否则 7 月 9 日将面临封杀。 本次封杀似乎不区分 IP ,而是直接按照地理位置。

电商数据自动化批量采集:商品数据|订单数据|店铺数据|图片搜索|关键字搜索

电商竞争白热化的今天,一个电商卖家往往会在多个平台铺设店铺来获取更多的客户。有没有什么高效的电商数据采集方式呢? 针对主流电商平台数据采集、ERP、OA等业务系统数据采集、行业数据采集,可以用以下5种电商数据采集方式: API…

【Linux】Ubuntu 部署 Zabbix 7.0

实验环境:Ubuntu-22.04 官方下载地址: 下载Zabbix 7.0 LTS for Ubuntu 22.04 (Jammy), MySQL, Apache 1、下载 Zabbix 官方安装包以及环境配置 下载 zabbix 安装包 wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabb…

Spring-Boot整合Redis【随记】

基于spring boot整合. 1 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2 编写redis的配置文件 application.yml进行编写. 属性: url por…

掌握Three.js:学习路线,成为3D可视化开发的高手!

学习Three.js可以按照以下路线进行&#xff1a; 基础知识&#xff1a; 首先要了解基本的Web开发知识&#xff0c;包括HTML、CSS和JavaScript。如果对这些知识已经比较熟悉&#xff0c;可以直接进入下一步。 Three.js文档&#xff1a; 阅读Three.js官方文档是学习的第一步。官…

(更新)2004-2022年 全国各省环境污染治理投资额数据

环境污染治理投资额是衡量一个国家或地区在环境保护和污染治理方面投入力度的重要经济指标。它体现了政府和企业在改善环境质量、推动绿色发展方面的共同努力&#xff0c;同时也是环境规制政策执行强度的一个反映。 数据简介 环境污染治理投资额涵盖了以下几个方面&#xff1…

APP软件系统的开发流程

APP软件系统的开发是一个复杂的过程&#xff0c;需要多方面的知识和技能。建议选择专业的开发团队进行开发&#xff0c;以确保APP的质量和成功。APP软件系统的开发流程通常包括以下几个阶段。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

ONLYOFFICE 桌面编辑器 8.1全新发布,更强大的编辑工具

ONLYOFFICE 8.1 一、什么是ONLYOFFICE&#xff1f;二、怎么安装 ONLYOFFICE 8.1三、主要功能介绍四、总结 一、什么是ONLYOFFICE&#xff1f; ONLYOFFICE 是一款功能强大的办公套件&#xff0c;旨在提供全面的文档、表格和演示文稿编辑解决方案。它集成了文字处理、电子表格和演…

基于Hexo+GITHUB搭建个人博客网站(PS:不用域名,不用服务器,重点是免费,小白也能轻松掌握)

✌ 作者名字&#xff1a;高峰君主 &#x1f4eb; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f4ac; 人生格言&#xff1a;没有我不会的语言&#xff0c;没有你过不去的坎儿。&#x1f4ac; &#x1f5…

TMGM外汇:新兴市场的崛起,未来的经济引擎吗?

随着全球经济版图的不断变化&#xff0c;新兴市场逐渐成为国际投资的热点。从亚地区的中国和印度&#xff0c;到拉丁美洲的巴西和墨西哥&#xff0c;再到非洲的尼日利亚和南非&#xff0c;新兴市场的经济活力和潜力引起了全世界的关注。这些市场不仅人口众多&#xff0c;而且在…

win11 修改用户名

step1: 打开设置 step2: 如下图&#xff0c;点击“重命名”修改即可&#xff1b; 看似简单的问题&#xff0c;但若直接搜索查找&#xff0c;很难找到简单的操作&#xff0c;苦笑。。。

超炫酷, 不用学前端也能自己做网页!这个Python库,3分钟内复刻GPT WEB应用

大家好&#xff0c;我是海鸽。 今天&#xff0c;我要和大家分享如何将请求 GPT 的案例&#xff0c;快速“复刻”成 GPT 网页版。这不仅简单&#xff0c;而且对于我们这些后端开发者来说&#xff0c;简直是福音&#xff01; 先睹为快 看看这个界面&#xff0c;是不是感觉很熟…

php,python AES/CBC/PKCS7Padding加密解密 base64/hex编码

1. python版本 import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpadclass AESUtilCBC:def __init__(self, key, iv):self.key key.encode(utf-8)self.iv iv.encode(utf-8)self.pad_length AES.block_sizedef encrypt(self, data):try…

flutter是app跨平台最优解吗?

哈喽&#xff0c;我是老刘 最近在知乎上看到这样一个问题 我们先来解释一下问题中碰到的几个现象的可能原因&#xff0c;然后聊聊跨平台的最优解问题 问题解释 1、跟手、丝滑问题 这个问题其实很多人是有误解的&#xff0c;觉得原生的就丝滑跟手 其实不是这样的 我在做Flut…

『 Linux 』 进程间通信 - 匿名管道 (万字)

文章目录 什么是管道匿名管道的直接原理pipe( )系统调用接口匿名管道代码示例匿名管道的特征总结 什么是管道 管道(Pipe) 是一种基本的进程间通信(IPC)机制,允许一个进程与另一个进程之间进行数据传输; 管道工作方式类似于生活中的水管因此命名为管道,数据从一端流入另一段流出…

NSSCTF-Web题目16

目录 [GDOUCTF 2023]受不了一点 1、题目 2、知识点 3、思路 [UUCTF 2022 新生赛]ez_upload 1、题目 2、知识点 3、思路 [GDOUCTF 2023]受不了一点 1、题目 2、知识点 php代码审计、数组绕过、弱比较绕过 3、思路 打开题目&#xff0c;出现代码&#xff0c;我们进行代…

【STM32】江科大STM32学习笔记汇总(已完结)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 打赏04. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【ST…

VUE div的右上角的角标/标签

一、效果图 二、代码 <div class"comp-overview"><div class"overview-item" v-for"(item,index) in overviewInfoList" :key"index"><div class"angle_mark"><span>{{item.label}}</span>&…