【Python】yield from 功能解析

news2025/6/2 3:17:03

yield from 功能解析

  • 1.基本功能
    • 1.1 传统写法(手动迭代)
    • 1.2 使用 yield from
  • 2.与普通 yield 的区别
  • 3.yield from 的底层行为
  • 4.关键应用场景
    • 场景 1:拼接多个生成器(如 gen_concatenate)
    • 场景 2:捕获子生成器的返回值
    • 场景 3:协程(Coroutine)中的委托
  • 5.为什么在 gen_concatenate 中用 yield from
  • 6.与 itertools.chain 的对比
  • 7.总结

在博客《迭代器与生成器(四)》的《13.创建数据处理管道》和《14.展开嵌套的序列》中都提及了 yield from 的用法,本篇博客将进行详细的介绍。

yield from 是 Python 中的一个语法(PEP 380),用于简化生成器(generator)中 委托子生成器 的操作。它的核心作用是让一个生成器能够将部分或全部生成逻辑 “委托” 给另一个生成器,从而避免手动编写循环来逐个生成子生成器的值。下面通过对比和示例详细解释。

1.基本功能

yield from 的主要用途是 扁平化嵌套生成器

假设有一个生成器 A 需要生成另一个生成器 B 的所有值,传统写法需要手动迭代 B,而 yield from 可以直接委托。

1.1 传统写法(手动迭代)

def generator_A():
    for item in generator_B():  # 手动迭代子生成器
        yield item

1.2 使用 yield from

def generator_A():
    yield from generator_B()  # 自动委托给子生成器

2.与普通 yield 的区别

  • yield:生成单个值。
  • yield from:生成另一个生成器的 所有值

示例对比

def sub_gen():
    yield 1
    yield 2

# 普通 yield 生成的是子生成器对象本身
def gen_normal():
    yield sub_gen()  # 生成的是生成器对象,不是值

# yield from 生成的是子生成器的值
def gen_delegated():
    yield from sub_gen()  # 生成 1 和 2

print(list(gen_normal()))    # 输出: [<generator object sub_gen at 0x...>]
print(list(gen_delegated())) # 输出: [1, 2]

3.yield from 的底层行为

yield from 实际上等价于以下代码:

def yield_from(gen):
    for item in gen:  # 自动迭代子生成器
        yield item
    # 处理子生成器的 return 值(如果有)

但它还额外支持以下高级特性:

  • 子生成器的返回值:如果子生成器通过 return 返回值,yield from 可以捕获它(见下文示例)。
  • 双向通信:子生成器可以通过 .send().throw() 与外部调用者交互。

4.关键应用场景

场景 1:拼接多个生成器(如 gen_concatenate)

def gen_concatenate(iterators):
    for it in iterators:
        yield from it  # 等价于:for item in it: yield item

# 使用示例
list1 = [1, 2]
list2 = [3, 4]
combined = gen_concatenate([list1, list2])
print(list(combined))  # 输出: [1, 2, 3, 4]

场景 2:捕获子生成器的返回值

def sub_gen():
    yield 1
    yield 2
    return "Done"

def delegator():
    result = yield from sub_gen()
    print(f"子生成器返回: {result}")

list(delegator())
# 输出:
# 子生成器返回: Done

场景 3:协程(Coroutine)中的委托

在异步编程中,yield from 用于委托子协程(Python 3.5 + 3.5+ 3.5+ 后被 await 取代):

def async_task():
    yield from asyncio.sleep(1)  # 模拟异步IO

5.为什么在 gen_concatenate 中用 yield from

  • 避免手动循环:如果不用 yield from,需要写两层循环:
    def gen_concatenate(iterators):
        for it in iterators:
            for item in it:  # 手动嵌套循环
                yield item
    
  • 清晰性与性能yield from 直接委托给 Python 解释器处理,代码更简洁且效率更高。

6.与 itertools.chain 的对比

yield from 的功能类似于 itertools.chain.from_iterable,但更灵活:

# 等效实现
from itertools import chain

def gen_concatenate(iterators):
    yield from chain.from_iterable(iterators)

yield from 的优势在于:

  • 可读性:直接表明 “委托生成” 的意图。
  • 扩展性:方便添加自定义逻辑(如异常处理或日志)。

7.总结

  • yield from 的作用:将当前生成器的控制权临时交给另一个生成器,并生成其所有值。
  • 核心用途
    • 拼接多个生成器(扁平化嵌套迭代)。
    • 实现协程委托(Python 3.5 之前)。
    • 捕获子生成器的返回值。
  • 优势:代码简洁、避免手动循环、支持高级生成器特性。

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

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

相关文章

改写自己的浏览器插件工具 myChromeTools

1. 起因&#xff0c; 目的: 前面我写过&#xff0c; 自己的一个浏览器插件小工具 最近又增加一个小功能&#xff0c;可以自动滚动页面&#xff0c;尤其是对于那些瀑布流加载的网页。最新的代码都在这里 2. 先看效果 3. 过程: 代码 1, 模拟鼠标自然滚动 // 处理滚动控制逻辑…

python-pptx去除形状默认的阴影

文章目录 效果原理1. 阴影继承机制解析2. XML层操作细节3. 注意事项 扩展应用1. 批量去除阴影2. 复合效果控制 效果 右边这个是直接添加一个形状。可以看到它会默认被赋予一个阴影。 然而&#xff0c;这个东西在特定的场合&#xff0c;其实是我们所不需要的。 那怎么把这个阴…

kuboard自带ETCD存储满了处理方案

一、前言 当运行 ETCD 日志报 Erro: mvcc database space exceeded 时&#xff0c;说明 ETCD 存储不足了&#xff08;默认 ETCD 存储是 2G&#xff09;&#xff0c;配额会触发告警&#xff0c;然后 Etcd 系统将进入操作受限的维护模式。 通过下面命令可以查看 ETCD 存储使用情…

SpringBoot+tabula+pdfbox解析pdf中的段落和表格数据

一、前言 在日常业务需求中&#xff0c;往往会遇到解析pdf文件中的段落或者表格数据的需求。 常见的做法是使用 pdfbox 来做&#xff0c;但是它只能提取文本数据&#xff0c;没有我们在文件页面上面的那种结构化组织&#xff0c;文本通常是散乱的包含各种换行回车空格等格式&a…

GitHub push失败解决办法-fatal: unable to access ‘https://github.com/xxx

问题描述&#xff1a; 问题解决&#xff1a; 1、首先查找自己电脑的代理地址和端口 windows教程如下&#xff1a; 1、搜索控制面板-打开Internet选项 2、点击局域网设置&#xff1a; 3、如图为地址和端口号 即可获得本机地址和端口号 2、根据上一步获得的本机地址和端口号为…

电商平台 API、数据抓取与爬虫技术的区别及优势分析

一、技术定义与核心原理 电商平台 API&#xff08;应用程序编程接口&#xff09; 作为平台官方提供的标准化数据交互通道&#xff0c;API 通过 HTTP 协议实现不同系统间的结构化数据传输。开发者需申请授权&#xff08;如 API 密钥&#xff09;&#xff0c;按照文档规范调用接口…

单卡4090部署Qwen3-32B-AWQ(4bit量化)-vllm

单卡4090部署Qwen3-32B-AWQ(4bit量化) 模型&#xff1a;Qwen3-32B-AWQ(4bit量化) 显卡&#xff1a;4090 1 张 python版本 python 3.12 推理框架“vllm 重要包的版本 vllm0.9.0创建GPU云主机 这里我使用的是优云智算平台的GPU&#xff0c;使用链接可以看下面的 https://blog.…

漫画Android:Handler机制是怎么实现的?

线程之间通信会用到Handler&#xff0c;比如&#xff0c;在子线程中进行耗时的网络请求任务&#xff0c;子线程在获取到数据后&#xff0c;更新界面的时候就需要用到Handler&#xff1b; 子线程在获取到数据后&#xff0c;不直接去更新 界面&#xff0c;而是把数据通过一个消息…

多部手机连接同一wifi的ip一样吗?如何更改ip

通常情况下&#xff0c;多部手机连接同一个WiFi时&#xff0c;它们的IP地址是各不相同的&#xff08;在局域网内&#xff09;。但是&#xff0c;从互联网&#xff08;外网&#xff09;的角度看&#xff0c;它们共享同一个公网IP地址。让我详细解释一下&#xff0c;并说明如何更…

飞牛fnNAS的Docker应用之迅雷篇

目录 一、“迅雷”应用安装 二、启动迅雷 三、迅雷账号登录 四、修改“迅雷”下载保存路径 1、下载路径准备 2、停止“迅雷”Docker容器 3、修改存储位置 4、重新启动Docker容器 5、再次“启用”迅雷 五、测试 1、在PC上添加下载任务 2、手机上管理 3、手机添加下…

SQLMesh 用户定义变量详解:从全局到局部的全方位配置指南

SQLMesh 提供了灵活的多层级变量系统&#xff0c;支持从全局配置到模型局部作用域的变量定义。本文将详细介绍 SQLMesh 的四类用户定义变量&#xff08;global、gateway、blueprint 和 local&#xff09;以及宏函数的使用方法。 一、变量类型概述 SQLMesh 支持四种用户定义变量…

inviteflood:基于 UDP 的 SIP/SDP 洪水攻击工具!全参数详细教程!Kali Linux教程!

简介 一种通过 UDP/IP 执行 SIP/SDP INVITE 消息泛洪的工具。该工具已在 Linux Red Hat Fedora Core 4 平台&#xff08;奔腾 IV&#xff0c;2.5 GHz&#xff09;上测试&#xff0c;但预计该工具可在各种 Linux 发行版上成功构建和执行。 inviteflood 是一款专注于 SIP 协议攻…

Visual Studio 2022 设置自动换行

Visual Studio 2022 设置自动换行 一、在 Visual Studio 菜单栏上&#xff0c;选择 工具>选项二、选择“文本编辑器”>“所有语言”>“常规” 全局设置此选项。 一、在 Visual Studio 菜单栏上&#xff0c;选择 工具>选项 二、选择“文本编辑器”>“所有语言”&…

【Linux网络篇】:简单的TCP网络程序编写以及相关内容的扩展

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 一.简单的TCP网络程序相关接口代码实现服务器单进程版服务器多…

Scratch节日 | 粽子收集

端午节怎么过&#xff1f;当然是收粽子啦&#xff01;这款 粽子收集 小游戏&#xff0c;让你一秒沉浸节日氛围&#xff0c;轻松收集粽子&#xff0c;收获满满快乐&#xff01; &#x1f3ae; 玩法介绍f 开始游戏&#xff1a;点击开始按钮&#xff0c;游戏正式开始&#xff01;…

stl三角面元文件转颗粒VTK文件

效果展示&#xff1a; import os import sys import json import argparse import numpy as np import pandas as pd import open3d as o3d from glob import globPARTICLE_RADIUS 0.025def stl_to_particles(objpath, radiusNone):if radius is None:radius PARTICLE_RADIU…

Java String的使用续 -- StringBuilder类和StringBuffer

文章目录 字符串的不可变性StringBuilder和StringBuffer函数使用 字符串的不可变性 字符串不可变是因为有private修饰&#xff0c;只能在类的内部使用不可以在类外使用&#xff0c;因此使用时是不可以修改字符串的 public class test {public static void main(String[] args…

基于python+Django+Mysql的校园二手交易市场

文章目录 基于pythonDjangoMysql的校园二手交易市场运行步骤系统设计功能设计任务目标用户特点参与者列表基本要求功能模块图 数据库设计会员用户信息表&#xff08;user_userinfo&#xff09;商品信息表&#xff08;goods_goodsinfo&#xff09;管理员用户信息表&#xff08;a…

从零打造算法题刷题助手:Agent搭建保姆级攻略

我用Trae 做了一个有意思的Agent 「大厂机试助手」。 点击 https://s.trae.com.cn/a/d2a596 立即复刻&#xff0c;一起来玩吧&#xff01; Agent 简介 Agent名称为大厂机试助手&#xff0c;主要功能有以下三点。 解题&#xff1a; 根据用户给出的题目给出具体的解题思路引导做…

懒人云电脑方案:飞牛NAS远程唤醒 + 节点小宝一键唤醒、远程控制Windows!

后台高频问题解答&#xff1a; “博主&#xff0c;飞牛NAS能定时开关机了&#xff0c;能不能让它顺便把家里Windows电脑也远程唤醒控制&#xff1f;最好点一下就能连&#xff0c;不用记IP端口那种&#xff01;” 安排&#xff01;今天这套方案完美实现&#xff1a; ✅ 飞牛NAS…