Python中 yield的作用

Python中 yield的作用

flyfish

在英语中,yield 有“产生”、“产出”、“让出”等含义。在 Python 中,yield 的作用与这些含义相符。
当生成器函数执行到 yield 语句时,它会“产生”一个值并暂停执行,等待下一次调用。这与“产出”和“让出”控制权的概念一致。
生成器函数通过 yield 语句逐步生成值,而不是一次性返回所有值,这符合“产生”和“逐步提供”的概念。
yield 这个关键字,是为了明确表示生成器函数的特殊行为,即在生成值的同时保留状态,以便在后续调用中继续执行。

生成器函数

yield 最主要的功能是定义生成器函数。生成器函数在每次调用 next() 或在 for 循环中迭代时,从上次暂停的地方继续执行,直到遇到下一个 yield 语句。这种方式使得生成器能够逐步生成值,而不是一次性生成所有值,从而大大节省了内存资源。

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

这段代码展示了生成器的基本用法。通过 yield,我们可以在函数内部保存状态,并在每次调用时恢复执行,从而实现了高效的值生成机制。

节省内存

生成器的一个显著优点是其能够节省内存。在处理大规模数据集时,生成器可以逐步生成值,而不需要将所有数据一次性加载到内存中。这在处理大数据或无限序列时尤为重要,可以显著提高程序的性能和效率。

def large_range(n):for i in range(n):print(i)yield ifor i in large_range(9):if i % 3== 0:print("-----")

输出

0
-----
1
2
3
-----
4
5
6
-----
7
8
惰性求值

生成器支持惰性求值(lazy evaluation),即值只有在需要时才会计算。这一特性在处理复杂或昂贵的计算时特别有用,可以显著提高程序的性能。

def expensive_computation(values):for value in values:result = value * valueyield resultfor result in expensive_computation(range(5)):print(result)

输出

0
1
4
9
16

这里,expensive_computation 生成器在每次迭代时才计算平方值,而不是一次性计算所有值,从而节省了计算资源。

协程

生成器还可以用于实现协程(coroutine)。协程是一种更高级的生成器,可以通过 yield 语句接收外部输入,实现双向通信。这使得协程在处理异步任务和事件驱动编程中非常有用。

def coroutine_example():while True:x = yieldprint(f"Received: {x}")coro = coroutine_example()
next(coro)  # 预激协程
coro.send(10)  # 发送值给协程
coro.send(20)  # 再次发送值

输出

Received: 10
Received: 20

在这个例子中,coroutine_example 生成器通过 yield 接收外部输入,并在每次接收到值时打印出来。这种双向通信的能力使得协程在复杂的应用场景中具有强大的灵活性。

异步生成器

在异步编程中,可以使用 async def 定义异步生成器,并用 yield 语句生成值。异步生成器可以与 async for 一起使用,从而实现高效的异步数据处理。

import asyncioasync def async_generator():for i in range(5):await asyncio.sleep(1)  # 模拟异步操作yield iasync def main():async for value in async_generator():print(value)asyncio.run(main())

输出

0
1
2
3
4

使用异步生成器处理异步任务。通过 awaityield 的结合,异步生成器能够在异步操作之间高效地生成值。

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

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

相关文章

Django安装

在终端创建django项目 1.查看自己的python版本 输入对应自己本机python的版本,列如我的是3.11.8 先再全局安装django依赖包 2.在控制窗口输入安装命令: pip3.11 install django 看到Successflully 说明我们就安装成功了 python的Scripts文件用于存…

网络层5——IPV6

目录 一、IPv6 vs IPv4 1、对IPv6主要变化 2、IPv4 vs IPv6 二、IPv6基本首部 1、版本——4位 2、通信量类——8位 3、流标号——20位 4、有效载荷长度——16位 5、下一个首部——8位 6、跳数限制——8位 7、源 、 目的地址——128位 8、扩展首部 三、IPv6地址 1…

怎么样鉴定疾病相关稀有细胞群?二值化精细模型标签,这个刚发的顶刊单细胞算法值得一学!

生信碱移 HiDDEN:抽丝剥茧 在具有病例和对照单细胞RNA测序研究中,样本级标签通常被直接赋予单个细胞,假设所有病例细胞都受影响。这种传统方法在受影响细胞比例较小或扰动强度较弱时,难以有效识别关键细胞及其标记基因&#xff…

三周精通FastAPI:33 在编辑器中调试

官方文档:https://fastapi.tiangolo.com/zh/tutorial/debugging/ 调试 你可以在编辑器中连接调试器,例如使用 Visual Studio Code 或 PyCharm。 调用 uvicorn 在你的 FastAPI 应用中直接导入 uvicorn 并运行: import uvicorn from fast…

Spring Boot关闭时,如何确保内存里面的mq消息被消费完?

1.背景 之前写一篇文章Spring Boot集成disruptor快速入门demo,有网友留言如下图: 针对网友的留言,那么我们如何解决这个问题呢 Spring-Boot应用停机时,如何保证其内存消息都处理完成? 2.解决方法 方法其实挺简单的&…

vue3+vite搭建脚手架项目使用eletron打包成桌面应用+可以热更新

当前Node版本:18.12.0,npm版本:8.19.2 1.搭建脚手架项目 搭建Vue3ViteTs脚手架-CSDN博客 可删掉index.html文件的title标签 2.配置package.json {"name": "my-vite-project","private": true,"versi…

【Golang】validator库的使用

package mainimport ("fmt""github.com/go-playground/validator" )// MyStruct .. validate:"is-awesome"是一个结构体标签,它告诉验证器使用名为is-awesome的验证规则来验证String字段。 type MyStruct struct {String string vali…

Linux(CentOS)安装 MySQL

CentOS版本:CentOS 7 MySQL版本:MySQL Community Server 8.4.3 LTS 1、下载 MySQL 打开MySQL官网:https://www.mysql.com/ 直接下载网址:https://dev.mysql.com/downloads/mysql/ 其他版本 2、上传 MySQL 文件到 CentOS 使用F…

Pytorch实现transformer语言模型

转载自&#xff1a;| 03_language_model/02_Transformer语言模型.ipynb | 从头训练Transformer语言模型 |Open In Colab | Transformer语言模型 本节训练一个 sequence-to-sequence 模型&#xff0c;使用pytorch的 nn.Transformer <https://pytorch.org/docs/master/nn.ht…

<Project-20 YT-DLP> 给视频网站下载工具 yt-dlp/yt-dlp 加个页面 python web

介绍 yt-dlp Github 项目&#xff1a;https://github.com/yt-dlp/yt-dlp A feature-rich command-line audio/video downloader 一个功能丰富的视频与音频命令行下载器 原因与功能 之前我用的 cobalt 因为它不再提供Client Web功能&#xff0c;只能去它的官网使用。 翻 redd…

Sqli-Labs

目录 解题思路 题目设计原理 总结 解题思路 什么&#xff1f;sqli-labs&#xff1f;让我看看。还真是。想起了当初刚学被支配的恐惧。 悄咪咪点开第一关看看能不能秒了。测试闭合老样子&#xff0c;单引号闭合&#xff0c;双引号等都成功。这里 and 11 和 # 都不能通过检测&…

【基于Zynq FPGA对雷龙SD NAND的测试】

一、SD NAND 特征 1.1 SD 卡简介 雷龙的 SD NAND 有很多型号&#xff0c;在测试中使用的是 CSNP4GCR01-AMW 与 CSNP32GCR01-AOW。芯片是基于 NAND FLASH 和 SD 控制器实现的 SD 卡。具有强大的坏块管理和纠错功能&#xff0c;并且在意外掉电的情况下同样能保证数据的安全。 …

【NOIP提高组】引水入城

【NOIP提高组】引水入城 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 在一个遥远的国度&#xff0c;一侧是风景秀美的湖泊&#xff0c;另一侧则是漫无边际的沙漠。该国的行政 区划十分特殊&#xff0c;刚好构成一个N行M列的矩形&#xff…

鸿蒙开发:arkts 如何读取json数据

为了支持ArkTS语言的开发&#xff0c;华为提供了完善的工具链&#xff0c;包括代码编辑器、编译器、调试器、测试工具等。开发者可以使用这些工具进行ArkTS应用的开发、调试和测试。同时&#xff0c;华为还提供了DevEco Studio这一一站式的开发平台&#xff0c;为运行在Harmony…

OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据 ECC 标准 78找到两幅图像之间的几何变换&#xff08;warp&#xff09;。 该函数根据 ECC 标准 ([78]) 估计最优变换&#xff08;warpMatri…

【2024最新版Kotlin教程】Kotlin第一行代码系列第五课-类继承,抽象类,接口

【2024最新版Kotlin教程】Kotlin第一行代码系列第五课-类继承&#xff0c;抽象类&#xff0c;接口 为什么要有继承呢&#xff0c;现实中也是有继承的&#xff0c;对吧&#xff0c;你继承你爸的遗产&#xff0c;比如你爸建好了一个房子&#xff0c;儿子继承爸&#xff0c;就得了…

iOS用rime且导入自制输入方案

iPhone 16 的 cantonese 只能打传统汉字&#xff0c;没有繁简转换&#xff0c;m d sh d。考虑用「仓」输入法 [1] 使用 Rime 打字&#xff0c;且希望导入自制方案 [2]。 仓输入法有几种导入方案的方法&#xff0c;见 [3]&#xff0c;此处记录 wifi 上传法。准备工作&#xff1…

基于Zynq FPGA的雷龙SD NAND存储芯片性能测试

文章目录 前言一、SD NAND特征1.1 SD卡简介1.2 SD卡Block图 二、SD卡样片三、Zynq测试平台搭建3.1 测试流程3.2 SOC搭建 四、软件搭建五、测试结果六、总结 前言 随着嵌入式系统和物联网设备的快速发展&#xff0c;高效可靠的存储解决方案变得越来越重要。雷龙发展推出的SD NA…

【动态规划 数学】2745. 构造最长的新字符串|1607

本文涉及知识点 C动态规划 数学 LeetCode2745. 构造最长的新字符串 给你三个整数 x &#xff0c;y 和 z 。 这三个整数表示你有 x 个 “AA” 字符串&#xff0c;y 个 “BB” 字符串&#xff0c;和 z 个 “AB” 字符串。你需要选择这些字符串中的部分字符串&#xff08;可以全…

【Linux驱动开发】timer库下的jiffies时间戳和延时驱动编写

【Linux驱动开发】timer库下的jiffies时间戳和延时驱动编写 gitee地址&#xff1a; https://gitee.com/Mike_Zhou_Admin/Linux_Driver_Timestamp_Driver/更新以gitee为准 文章目录 timer库时间戳函数延时函数驱动代码应用测试附录&#xff1a;嵌入式Linux驱动开发基本步骤开发…