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) 一、简介 记录简单的摄像头监…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...