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

Python yield关键字

1、什么是yield关键字

yield 是 Python 中的一个关键字,它用于定义生成器函数。生成器是一种特殊的迭代器,它可以在遍历过程中逐步产生值,而不是一次性生成所有值并将其存储在内存中。这使得生成器非常适合处理大量数据或无限序列,因为它们只在需要时才生成下一个值,从而节省了内存。

当你在一个函数中使用 yield 语句时,这个函数就变成了一个生成器函数。调用生成器函数并不会立即执行其中的代码,而是返回一个生成器对象。当对这个生成器对象进行迭代(例如通过 for 循环或者调用 next() 函数)时,生成器函数会从上次暂停的地方继续执行,直到遇到下一个 yield 语句,然后返回当前的值,并再次暂停等待下一次迭代。

eg:斐波那契函数

def fibonacci(n):a, b = 0, 1for _ in range(n):yield aa, b = b, a + b# 使用生成器
for num in fibonacci(10):print(num)

在这个例子中,fibonacci 是一个生成器函数,它会生成前 n 个斐波那契数。每次迭代都会计算下一个斐波那契数,并通过 yield 返回该数值,而不占用额外的内存空间来存储整个序列。

2、使用方法

1、yield 单独使用

在这种情况下,yield 不返回任何值(实际上它会返回 None)。这种方式通常用于创建一个简单的迭代器,当只需要控制流而不需要传递具体值时。

def simple_generator():yieldprint("After first yield")yieldprint("After second yield")gen = simple_generator()
next(gen)  # 代码运行到第一个yield后停止,没有打印任何内容
next(gen)  # 代码从第一个打印语句开始执行,然后遇到yield停止运行,打印第一个打印语句
next(gen)  # 代码从第二个执行语句开始执行,打印第二个语句,但是没有了yield,报停止迭代异常

2、基本用法:返回值并暂停执行

这是最基础的用法,yield 可以用来代替 return 返回一个值给调用者,但是不会终止函数的执行。相反,它会保存函数的状态,并且可以在下次迭代时从中断的地方继续执行。

def simple_generator():yield 1yield 2yield 3if __name__ == '__main__':a = simple_generator()print(a.__next__())print(a.__next__())print(a.__next__())

依次打印1,2,3,每次调用生成一个值

如果调用的次数超过可迭代的次数,比如上述代码,再次调用

print(a.__next__()),会报StopIteration错误

3、yield 前边使用一个变量接收

yield 表达式可以出现在赋值语句的右侧,允许从外部向生成器发送数据。这通过 .send() 方法实现,发送的数据将作为 yield 表达式的结果被接收到。

def echo():while True:received = yieldprint(f"Received: {received}")e = echo()
next(e)  # 必须先启动生成器
e.send('hello')  # 输出:Received: hello
e.send('world')  # 输出:Received: world

next(e),代码运行到yield这行后停止运行,然后调用send方法

相当于给received 赋值,然后执行打印语句,然后又执行到yiel语句停止

再次调用send方法,仍然是这样继续操作

在这个例子中,received 变量接收了从外部发送进来的值,并打印出来。需要注意的是,在第一次调用 .send() 方法之前,必须至少调用一次 next() 来启动生成器。

4、yield from

`yield from` 是 Python 中用于简化从子生成器中提取值的过程的一种语法。它使得你可以更方便地将一个生成器委托给另一个生成器,从而创建更复杂的迭代模式。使用 `yield from` 可以减少代码量,并且使代码更加清晰易读。

`yield from` 的基本含义

当你在一个生成器函数中使用 `yield from <iterable>` 时,Python 会自动迭代 `<iterable>`,并且对于每一个产生的值都会执行一次 `yield`。这相当于在每次迭代时都调用 `yield` 来返回当前的值给外部调用者。此外,`yield from` 还可以处理异常和发送值给子生成器,这对于实现协程非常有用。

使用场景

1. **简化嵌套循环**
2. **委派到子生成器**
3. **处理异常**
4. **发送值给子生成器**

示例说明

简化嵌套循环

假设你有一个包含多个列表的列表,你想一次性迭代所有元素:```python

def flatten(nested_list):for sublist in nested_list:for item in sublist:yield item# 使用 yield from 简化上面的代码
def flatten_with_yield_from(nested_list):for sublist in nested_list:yield from sublistnested = [[1, 2, 3], [4, 5], [6]]
for num in flatten_with_yield_from(nested):print(num)

委派到子生成器

如果你有一个复杂的迭代逻辑,可以将其拆分成几个子生成器,然后通过 `yield from` 将它们连接起来:

def generator_one():yield 'one'yield 'two'def generator_two():yield 'three'yield 'four'def combined_generator():yield from generator_one()yield from generator_two()for value in combined_generator():print(value)

输出将是:
```
one
two
three
four
```

 处理异常

`yield from` 也可以传递异常给子生成器:

def subgen():try:while True:x = yieldprint(f"Received: {x}")except GeneratorExit:print("Sub-generator is closing")def delegator():yield from subgen()g = delegator()
next(g)  # 启动生成器
g.send('hello')
g.close()  # 关闭生成器,触发 GeneratorExit 异常

发送值给子生成器

除了传递异常,`yield from` 还可以让主生成器向子生成器发送值:```python

def subgen():while True:x = yieldprint(f"Sub-generator received: {x}")def delegator():sg = subgen()next(sg)  # 启动子生成器yield from sgg = delegator()
next(g)  # 启动主生成器
g.send('hello')  # 发送值给子生成器

关键区别

  1. 层次结构

    • yield 通常用于定义单层生成器逻辑。
    • yield from 用于委派到子生成器,可以简化多层迭代逻辑。
  2. 代码简化

    • 使用 yield 时,如果需要遍历一个可迭代对象,你必须显式地写出循环来逐一 yield 每个元素。
    • yield from 自动完成这一过程,使得代码更加简洁明了。
  3. 双向通信

    • yield 只能直接与调用者交互。
    • yield from 支持主生成器与子生成器之间的双向通信,包括发送值和抛出异常。
  4. 异常处理

    • yield 需要在主生成器中手动处理异常。
    • yield from 自动处理并传播异常给子生成器,允许更复杂的错误管理。

相关文章:

Python yield关键字

1、什么是yield关键字 yield 是 Python 中的一个关键字&#xff0c;它用于定义生成器函数。生成器是一种特殊的迭代器&#xff0c;它可以在遍历过程中逐步产生值&#xff0c;而不是一次性生成所有值并将其存储在内存中。这使得生成器非常适合处理大量数据或无限序列&#xff0…...

tomcat的Mysql链接字符串问题

tomcat配置mysql链接需要改server.xml或content.xml。 但是server.xml或content.xml中mysql的配置看起来很古怪: url"jdbc:mysql://10.21.0.6:3306/hrdatabase?characterEncodinggbk&amp;autoReconnecttrue" 而使用springboot开发java应用&#xff0c;使用ya…...

聊聊JVM G1(Garbage First)垃圾收集器

CMS的垃圾回收机制&#xff0c;为什么分为四步https://blog.csdn.net/genffe880915/article/details/144205658说完CMS垃圾回收器&#xff0c;必定要说到目前一般应用项目中都推荐的G1。G1在JDK1.7 update4时引入&#xff0c;在JDK9时取代CMS成为默认的垃圾收集器。它是HotSpot…...

【论文复现】隐式神经网络实现低光照图像增强

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢&#xff1f; 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…...

Python知识分享第十九天-网络编程

网络编程 概述用来实现 网络互联 不同计算机上运行的程序间可以进行数据交互也叫Socket编程 套接字编程 三要素IP地址概述设备在网络中的唯一标识分类IPV4城域网13广域网22局域网31IPV6八字节 十六进制相关dos命令查看ipwindows: ipconfigmac和linux: ifconfig测试网络ping 域…...

C# 绘制GDI红绿灯控件

C# 绘制GDI红绿灯控件 using System; using System.Windows.Forms; using System.Drawing;public class TrafficLightControl : Control {protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);Graphics g e.Graphics;g.SmoothingMode System.Drawing.Drawin…...

Centos 8 服务器时间校正

Centos 8 服务器时间校正 使用chrony服务自动同步时间&#xff1a; 1.安装chrony&#xff1a; sudo dnf install chrony 2.启动并使chrony服务自动启动&#xff1a; sudo systemctl start chronyd sudo systemctl enable chronyd 3.添加配置置文件/etc/chrony.conf指向了可靠…...

模型 正则化方法(通俗解读)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。控制模型复杂度&#xff0c;防过拟合。 1 正则化方法的应用 1.1 正则化方法在教育领域的应用案例 - 重塑教学模式 背景&#xff1a; 在教育领域&#xff0c;正则化方法可以被理解为对教学模式和学习…...

ffmpeg命令

ffmpeg是专门处理多媒体文件&#xff08;包括音频、视频&#xff09;的命令&#xff1b; ffplay 是 ffmpeg 软件包中的一个命令行多媒体播放器&#xff0c;它主要用于播放音视频文件&#xff1b; # fmpeg命令转换格式&#xff0c;将mp3格式转换为wav格式 ffmpeg -i input.mp3…...

使用 EasyExcel 实现高效的 Excel 读写操作

在日常开发中&#xff0c;Excel 文件的读写操作是一个常见的需求。EasyExcel 是阿里巴巴开源的一个高性能、易用的 Excel 读写库&#xff0c;可以大幅提高处理 Excel 文件的效率。它通过事件驱动模型优化了大数据量 Excel 的读写性能&#xff0c;非常适合处理大文件或高并发场景…...

数据结构(栈Stack)

1.前言&#xff1a; 在计算机科学中&#xff0c;栈&#xff08;Stack&#xff09;是一种基础而存在的数据结构&#xff0c;它的核心特性是后进先出&#xff08;LIFO&#xff0c;Last In, First Out&#xff09;。想象一下&#xff0c;在现实生活中我们如何处理一堆托盘——我们…...

Windows 11 环境下 条码阅读器输入到记事本的内容不完整

使用Windows11时&#xff0c;为什么记事本应用程序中的扫描数据被截断或不完整?为什么sdo 特殊字符的显示与Windows 10 记事本应用程序不同? 很多人认为和中文输入法有关&#xff0c;其实主要问题出在这个windows11下的记事本程序上&#xff0c;大家知道这个就可以了&#x…...

【串口助手开发】visual studio 使用C#开发串口助手,生成在其他电脑上可执行文件,可运行的程序

1、改成Release&#xff0c;生成解决方案 串口助手调试成功后&#xff0c;将Debug改为Release&#xff0c;点击生成解决方案 2、运行exe文件 生成解决方案后&#xff0c;在bin文件夹下&#xff0c; Release文件夹下&#xff0c;生成相关文件 复制一整个Release文件夹&#xf…...

Redis设计与实现读书笔记

Redis设计与实现读书笔记 Redis设计与实现[^1]简单动态字符串SDS的基础定义与C字符串的差别常数获取长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数二进制安全函数兼容 链表链表和链表节点的实现 字典字典的实现哈希表定义哈希表节点定义字典定义 哈希算法解决键冲突…...

UE5 Do Once 节点

在 Unreal Engine 5 (UE5) 中&#xff0c;Do Once 节点是一个蓝图节点&#xff0c;用于确保某个操作或代码只执行一次&#xff0c;直到某些条件被重置。它通常用于处理需要执行一次的逻辑&#xff0c;例如初始化、事件触发、或防止重复执行某些操作。 如何使用 Do Once 节点&a…...

javascript(前端)作为客户端端通过grpc与cpp(服务端)交互

参考文章 https://blog.csdn.net/pathfinder1987/article/details/129188540 https://blog.csdn.net/qq_45634989/article/details/128151766 前言 临时让我写前端, 一些配置不太懂, 可能文章有多余的步骤但是好歹能跑起来吧 你需要提前准备 公司有自带的这些, 但是版本大都…...

前端常用缓存技术深度剖析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Asp.net Mvc在VSCore中如何将增删改查的增改添加数据传输到页面(需配合上一篇Mvc的增删改查一起)

Linq集成查询&#xff08;关联Lambda&#xff09; First FirstOrDefault 找到第一个符合条件的元素 First(x >x.Id id) 返回第一个Id等于id的元素&#xff0c;如果都没有符合的&#xff0c;报错FirstOrDefault(x >x.Id id) 返回第一个Id等于id的元素&#xff0c;如果…...

Android显示系统(04)- OpenGL ES - Shader绘制三角形

一、前言&#xff1a; OpenGL 1.0采用固定管线&#xff0c;OpenGL 2.0以上版本重要的改变就是采用了可编程管线&#xff0c;Shader 编程是指使用着色器&#xff08;Shader&#xff09;编写代码来控制图形渲染管线中特定阶段的处理过程。在图形渲染中&#xff0c;着色器是在 GP…...

微信 创建小程序码-有数量限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;有数量限制。 目录 文档 接口地址 功能描述 注意事项 请求参数 对接 获取小程序码 调用获取 小程序码示例 总结 文档 接口地址 https://api.weixin.qq.com/wxa/getwxacode?access_tokenaccess_token 功能描述 …...

Pixel Language Portal实战教程:使用WebSockets实现低延迟流式翻译响应

Pixel Language Portal实战教程&#xff1a;使用WebSockets实现低延迟流式翻译响应 1. 引言&#xff1a;当翻译遇上像素冒险 想象你正在玩一款16-bit像素风RPG游戏&#xff0c;每次对话选择都会触发实时翻译效果&#xff0c;文字像能量块一样在屏幕上流动。这正是Pixel Langu…...

终极指南:3个简单步骤免费下载B站4K大会员视频

终极指南&#xff1a;3个简单步骤免费下载B站4K大会员视频 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否曾遇到过这样的场景&…...

Citra模拟器终极指南:免费畅玩3DS游戏的完整教程

Citra模拟器终极指南&#xff1a;免费畅玩3DS游戏的完整教程 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/gh_mirrors/cit/citra 任天堂3DS模拟器Citra是一款开源的高性能游戏模拟工具&#xff0c;让PC用户能够流畅体验《精灵宝可梦》…...

网易云音乐美化插件全攻略:从核心价值到深度定制的个性化指南

网易云音乐美化插件全攻略&#xff1a;从核心价值到深度定制的个性化指南 【免费下载链接】refined-now-playing-netease &#x1f3b5; 网易云音乐沉浸式播放界面、歌词动画 - BetterNCM 插件 项目地址: https://gitcode.com/gh_mirrors/re/refined-now-playing-netease …...

告别卡顿!Windows播放器为何需要LAV Filters解码器加持?

告别卡顿&#xff01;Windows播放器为何需要LAV Filters解码器加持&#xff1f; 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters 你是否曾经遇到过这样的尴尬时…...

良心推荐!阿贝云免费云服务器,新手小白也能轻松上手

最近在折腾个人网站&#xff0c;想找个免费的云服务器练练手&#xff0c;试了好几家都不太满意。后来朋友推荐了阿贝云&#xff0c;体验下来感觉真的不错。 首先&#xff0c;阿贝云的免费云服务器配置很实在&#xff1a;1核CPU、1GB内存、5M带宽&#xff0c;还带独立公网IP。对…...

RexUniNLU新手必看:从模型下载到API服务部署完整流程

RexUniNLU新手必看&#xff1a;从模型下载到API服务部署完整流程 1. 引言&#xff1a;为什么选择RexUniNLU&#xff1f; RexUniNLU是一款基于Siamese-UIE架构的轻量级自然语言理解框架&#xff0c;它最大的特点是支持零样本学习——这意味着你不需要准备任何标注数据&#xf…...

Phi-4-mini-reasoning低成本部署:8GB显存即可运行的高性能推理模型

Phi-4-mini-reasoning低成本部署&#xff1a;8GB显存即可运行的高性能推理模型 1. 模型介绍 Phi-4-mini-reasoning 是一款专注于推理任务的文本生成模型&#xff0c;特别适合处理数学题、逻辑题、多步分析和简洁结论输出等场景。与通用聊天模型不同&#xff0c;它采用了"…...

Qwen3.5-4B-Claude-Opus-GGUF一键部署:CSDN镜像平台Web化推理服务上线指南

Qwen3.5-4B-Claude-Opus-GGUF一键部署&#xff1a;CSDN镜像平台Web化推理服务上线指南 1. 模型与平台介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型&#xff0c;重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理…...

Apache Mesos vs Kubernetes:如何选择最适合你的容器编排平台 [特殊字符]

Apache Mesos vs Kubernetes&#xff1a;如何选择最适合你的容器编排平台 &#x1f680; 【免费下载链接】mesos apache/mesos: 这是一个开源的集群管理框架&#xff0c;用于在异构资源池上部署和管理应用程序。它允许开发者使用高效的资源隔离和共享机制&#xff0c;构建高度可…...