Python中的yield
文章目录
- 1. Python中的yield
- 1.1 一个简单的示例
- 1.2 示例的每一步含义
- 2. yield 和return的区别
- 2.1 一个简单的示例
- 2.2 示例中每一步的含义
- 3. yield中的send()方法
- 3.1 一个简单的示例
- 3.2 示例中每一步的含义
- 4. yield中的throw()方法
- 4.1 一个简单的示例
- 4.2 示例中每一步的含义
1. Python中的yield
yield 是 Python 中用于创建生成器的关键字之一。它可以在函数内部暂停执行并返回一个值,但是保留了函数的状态,使得函数可以在后续调用时恢复执行,从上次暂停的地方继续执行。这种特性使得生成器可以逐步产生值,而不需要一次性将所有值存储在内存中,从而节省了内存空间。
1.1 一个简单的示例
我们可以通过一个简单的示例来说明 yield 的使用:
def count_up_to(limit):count = 1while count <= limit:yield countcount += 1# 创建一个生成器对象
counter = count_up_to(5)# 逐步获取生成器产生的值并打印
print(next(counter)) # 输出:1
print(next(counter)) # 输出:2
print(next(counter)) # 输出:3
print(next(counter)) # 输出:4
print(next(counter)) # 输出:5
1.2 示例的每一步含义
def count_up_to(limit)::这是一个生成器函数的定义,它命名为count_up_to,接受一个参数limit,用于指定计数的上限。count = 1:这是计数器的初始化,从 1 开始计数。while count <= limit::这是一个循环,它会在计数小于等于上限时持续执行。yield count:这是yield语句,它会产生当前计数值并暂停函数的执行。在每次迭代中,生成器会生成一个值并将控制权返回给调用方。count += 1:这是计数器的增加步骤,每次迭代时,计数器增加 1。counter = count_up_to(5):这里创建了一个生成器对象,调用count_up_to()函数并将其赋值给变量counter。print(next(counter)):在生成器对象上调用next()函数,这会使生成器函数从上次暂停的地方继续执行,生成并返回下一个计数值。
通过 yield,我们可以实现一个能够逐步产生数值的生成器函数。这个函数在每次迭代时都会生成一个值并暂停执行,直到下一次迭代开始。这种逐步生成值的方式非常高效,特别是在处理大量数据或无限序列时。
2. yield 和return的区别
yield 和 return 在 Python 中有着不同的作用,尽管它们都可以用于函数中的值的返回,但它们之间有着关键的区别。
2.1 一个简单的示例
让我们通过一个示例来说明它们的区别:
def generator_with_yield():yield 1yield 2yield 3def function_with_return():return [1, 2, 3]# 使用生成器函数
gen = generator_with_yield()
print(next(gen)) # 输出:1
print(next(gen)) # 输出:2
print(next(gen)) # 输出:3# 使用普通函数
result = function_with_return()
print(result) # 输出:[1, 2, 3]
2.2 示例中每一步的含义
def generator_with_yield()::这是一个生成器函数的定义。它使用yield语句产生值。在每次调用next()时,函数会执行到下一个yield语句,生成一个值并暂停执行,直到下一次调用。def function_with_return()::这是一个普通函数的定义。它使用return语句来返回一个列表。gen = generator_with_yield():这里创建了一个生成器对象,调用generator_with_yield()函数并将其赋值给变量gen。print(next(gen)):在生成器对象上调用next()函数,这会使生成器函数从头开始执行,生成第一个值并返回。每次调用next(),生成器函数都会继续执行,直到遇到下一个yield语句为止。result = function_with_return():在普通函数上调用,它会执行函数内部的代码,生成并返回一个列表。print(result):打印普通函数的返回值,这是一个包含[1, 2, 3]的列表。
关键区别:
yield可以在生成器函数中多次返回值,并且函数的状态会被保留,可以在后续调用中恢复执行。这使得生成器函数可以实现惰性计算和逐步生成值的功能。return一旦执行,会立即结束函数的执行,并将一个值返回给调用方。函数的状态不会被保留,无法恢复执行。
总的来说,yield 用于创建生成器函数,支持暂停和恢复执行,而 return 用于普通函数,用于一次性返回值并终止函数执行。
3. yield中的send()方法
在 Python 的 yield 中,send() 是一种方法,它允许在生成器函数内部发送数据,并使生成器继续执行。这种方法可以用于在生成器的每次迭代中向其提供值,以及控制生成器的行为。
3.1 一个简单的示例
下面是一个简单的示例,演示了如何在生成器函数中使用 send() 方法:
def accumulator():total = 0while True:value = yield totalif value is not None:total += value# 创建一个生成器对象
acc_gen = accumulator()# 启动生成器
next(acc_gen)# 使用 send() 方法向生成器发送值并获取结果
print(acc_gen.send(1)) # 输出:1
print(acc_gen.send(2)) # 输出:3
print(acc_gen.send(3)) # 输出:6
3.2 示例中每一步的含义
def accumulator()::这是一个生成器函数的定义,命名为accumulator。它没有参数。total = 0:这是累加器的初始化,开始时总和为 0。while True::这是一个无限循环,表示生成器函数会一直执行,直到外部调用方主动关闭生成器。value = yield total:这是yield语句,它会生成当前的总和值,并暂停函数的执行。在每次迭代中,生成器会生成一个值并将控制权返回给调用方。同时,它也是一个接收来自外部的值的地方,通过send()方法向生成器发送值。if value is not None::这是一个条件语句,检查发送的值是否为None,如果不是None,则表示有新的值要累加到总和中。total += value:这是将新值累加到总和中的步骤。acc_gen = accumulator():这里创建了一个生成器对象,调用accumulator()函数并将其赋值给变量acc_gen。next(acc_gen):这是启动生成器的步骤,通过next()函数开始执行生成器函数,使其执行到第一个yield语句处暂停。print(acc_gen.send(1)):在生成器对象上调用send()方法,发送值 1 给生成器,并获取生成器生成的总和值。
通过 send() 方法,我们可以在生成器的每次迭代中向其提供值,并控制生成器的行为。这种方法使得生成器函数更加灵活,可以与外部环境进行双向通信。
4. yield中的throw()方法
在 Python 的 yield 中,throw() 是一种方法,它允许在生成器函数内部抛出一个指定的异常,并使生成器处理该异常。这种方法可以用于在生成器函数中处理错误或特定情况,并根据需要采取相应的行动。
4.1 一个简单的示例
下面是一个简单的示例,演示了如何在生成器函数中使用 throw() 方法:
def catcher():try:while True:try:value = yieldprint("Received:", value)except ValueError as ve:print("ValueError occurred:", ve)except GeneratorExit:print("Generator closed.")# 创建一个生成器对象
gen = catcher()
next(gen) # 启动生成器# 在生成器中抛出异常
gen.throw(ValueError("Invalid value"))# 继续在生成器中发送值
gen.send(10)# 关闭生成器
gen.close()
4.2 示例中每一步的含义
def catcher()::这是一个生成器函数的定义,命名为catcher。它没有参数。try::这是一个 try 块,表示生成器函数会尝试执行其中的代码。while True::这是一个无限循环,表示生成器函数会一直执行,直到外部调用方主动关闭生成器。try::这是内部的 try 块,用于捕获可能在yield语句周围发生的异常。value = yield:这是yield语句,它会暂停函数的执行,并等待外部发送的值。在每次迭代中,生成器会生成一个值并将控制权返回给调用方。except ValueError as ve::这是一个 except 块,用于捕获特定类型的异常(在这里是ValueError)。print("Received:", value):这是打印接收到的值的步骤。except GeneratorExit::这是一个特殊的 except 块,用于捕获生成器关闭时的异常。gen = catcher():这里创建了一个生成器对象,调用catcher()函数并将其赋值给变量gen。next(gen):这是启动生成器的步骤,通过next()函数开始执行生成器函数,使其执行到第一个yield语句处暂停。gen.throw(ValueError("Invalid value")):在生成器对象上调用throw()方法,抛出一个ValueError异常。gen.send(10):继续在生成器中发送值,这里发送了一个整数值 10。gen.close():关闭生成器,这将导致生成器函数抛出GeneratorExit异常,生成器函数中的相应代码将被执行。
通过 throw() 方法,我们可以在生成器函数中抛出异常,并根据需要进行处理。这种方法使得生成器函数更加灵活,可以在生成器内部处理错误或特定情况。
相关文章:
Python中的yield
文章目录 1. Python中的yield1.1 一个简单的示例1.2 示例的每一步含义 2. yield 和return的区别2.1 一个简单的示例2.2 示例中每一步的含义 3. yield中的send()方法3.1 一个简单的示例3.2 示例中每一步的含义 4. yield中的throw()方法4.1 一个简单的示例4.2 示例中每一步的含义…...
【Linux】基于 Jenkins+shell 实现更新服务所需文件 -->两种方式:ssh/Ansible
👨🎓博主简介 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…...
5月4(信息差)
🎄 HDMI ARC国产双精度浮点dsp杜比数码7.1声道解码AC3/dts/AAC环绕声光纤、同轴、USB输入解码板KC33C 🌍 国铁集团回应高铁票价将上涨 https://finance.eastmoney.com/a/202405043066422773.html ✨ 源代码管理平台GitLab发布人工智能编程助手DuoCha…...
【Spring】1.Spring中IOC与DI全解析
本节将详细介绍Spring框架的两个核心概念:控制反转(IOC)和依赖注入(DI)。首先,我们会探讨IOC和DI的定义,实现原理,优点和缺点。然后,我们将介绍如何在Spring中使用IOC和D…...
vue2迁移到vue3,v-model的调整
项目从vue2迁移到vue3,v-model不能再使用了,需要如何调整? 下面只提示变化最小的迁移,不赘述vue2和vue3中的常规写法。 vue2迁移到vue3,往往不想去调整之前的代码,以下就使用改动较小的方案进行调整。 I…...
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、字符函数1.1 字符分类函数1.1.1 islower1.1.2 isupper 1.…...
android 如何显示网络地址对应的图片
1.android 如何显示网络地址对应的图片 在Android中显示网络地址对应的图片,通常有多种方法可以实现。以下是几种常见的方法: 1. 使用ImageView和Picasso库 Picasso是一个强大的图片加载库,它可以方便地加载网络图片并显示到ImageView中。 …...
【项目学习01_2024.05.02_Day04】
学习笔记 4 课程分类查询4.1需求分析4.2 接口定义4.3 接口开发4.3.1 树型表查询4.3.2 开发Mapper 4 课程分类查询 4.1需求分析 有课程分类的需求 course_category课程分类表的结构 这张表是一个树型结构,通过父结点id将各元素组成一个树。 利用mybatis-plus-gen…...
Android SQLite中的UNIQUE constraint failed错误
报错信息: UNIQUE constraint failed SQLite中的UNIQUE constraint failed错误,表明尝试插入或更新数据库时出现了违反唯一性约束的情况。唯一性约束确保在特定列或列集合中的值在表中是唯一的,即不能有重复的值。当你尝试插入或更新已存在于…...
嘴尚绝卤味:传承经典,缔造美食新风尚
卤味,作为中国传统美食的代表之一,历经千年的传承与发展,早已成为无数食客餐桌上的宠儿。而在这个美食盛行的时代,嘴尚绝卤味凭借其独特的口感和精湛的工艺,成为卤味市场中的佼佼者,引领着卤味文化的新潮流…...
Docker 入门与实践:从零开始构建容器化应用环境
Docker 一、docker常用命令docker ps 格式化输出Linux设置命令别名 二、数据卷相关命令挂载到默认目录(/var/lib/docker)挂载到本地目录 三、自定义镜像Dockerfile构建镜像的命令 四、网络自定义网络 五、DockerCompose相关命令 一、docker常用命令 dock…...
C# 用户控件UserControl事件解绑资源释放
用户控件继承子 UserControl 。 现在有个业务需求在UserControl 所在的窗体关闭时解除事件HMouseDown绑定。 因没有相关的Close事件。后来本人想了一个办法在 ROICtlDesigner类的 Dispose 方法中执行相关的释放代码 比如解除事件绑定 释放资源 public partial class ROICt…...
QT-QTCreator环境配置
准备工作: 下载QT: 链接:https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码:60b3下载WindowsKits: 链接:https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码:e2h8安装的…...
最大连续和
【问题描述】 对于一个具有n个元素的整型数组 a,求具有最大连续和的子数组(最少具有一个元素)。 【输入形式】 输入的第一行为一个整数 n,接下来的一行为 n 个整数,表示数组的元素。 【输出形式】 输出具有最大连续和的…...
分布式系统事务一致性解决方案(基于事务消息)
参考:https://rocketmq.apache.org/zh/docs/featureBehavior/04transactionmessage/ 文章目录 概要错误的方案方案一:业务方自己实现方案二:RocketMQ 事务消息什么是事务消息事务消息处理流程事务消息生命周期使用限制使用示例使用建议 概要 …...
Unity Animation--动画剪辑
Unity Animation--动画剪辑 动画剪辑 动画剪辑是Unity动画系统的核心元素之一。Unity支持从外部来源导入动画,并提供创建动画剪辑的能力使用“动画”窗口在编辑器中从头开始。 外部来源的动画 从外部来源导入的动画剪辑可能包括: 人形动画 运动捕捉…...
如何将 redis 快速部署为 docker 容器?
部署 Redis 作为 Docker 容器是一种快速、灵活且可重复使用的方式,特别适合开发、测试和部署环境。本文将详细介绍如何将 Redis 部署为 Docker 容器,包括 Docker 安装、Redis 容器配置、数据持久化、网络设置等方面。 步骤 1:安装 Docker 首…...
iOS - Undefined symbols: 解决方法
Undefined symbols: 是让人苦恼的报错,如何知道是 哪个 symbols 不对呢? 今天探索到下面的方法: 1、点击导航上方 最右侧的按钮,查看历史报错 2、选中报错信息,右键选择 Expand All Transcripts 在出现的详细信息面…...
优化理论复习——(三)
本篇介绍无约束优化的问题,通过四种算法来进行求解的过程和思路,也是最优化方法中的最重要的一类问题。 无约束优化问题主要是通过迭代搜索算法来切结,比线性规划的计算量都小一点。 目录 无约束优化问题最优性条件最速下降法牛顿法共轭梯度…...
RK3568笔记二十四:基于Flask的网页监控系统
若该文为原创文章,转载请注明原文出处。 此实验参考 《鲁班猫监控检测》,原代码有点BUG,已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
