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

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 示例的每一步含义

  1. def count_up_to(limit)::这是一个生成器函数的定义,它命名为 count_up_to,接受一个参数 limit,用于指定计数的上限。
  2. count = 1:这是计数器的初始化,从 1 开始计数。
  3. while count <= limit::这是一个循环,它会在计数小于等于上限时持续执行。
  4. yield count:这是 yield 语句,它会产生当前计数值并暂停函数的执行。在每次迭代中,生成器会生成一个值并将控制权返回给调用方。
  5. count += 1:这是计数器的增加步骤,每次迭代时,计数器增加 1。
  6. counter = count_up_to(5):这里创建了一个生成器对象,调用 count_up_to() 函数并将其赋值给变量 counter
  7. print(next(counter)):在生成器对象上调用 next() 函数,这会使生成器函数从上次暂停的地方继续执行,生成并返回下一个计数值。

通过 yield,我们可以实现一个能够逐步产生数值的生成器函数。这个函数在每次迭代时都会生成一个值并暂停执行,直到下一次迭代开始。这种逐步生成值的方式非常高效,特别是在处理大量数据或无限序列时。

2. yield 和return的区别

yieldreturn 在 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 示例中每一步的含义

  1. def generator_with_yield()::这是一个生成器函数的定义。它使用 yield 语句产生值。在每次调用 next() 时,函数会执行到下一个 yield 语句,生成一个值并暂停执行,直到下一次调用。
  2. def function_with_return()::这是一个普通函数的定义。它使用 return 语句来返回一个列表。
  3. gen = generator_with_yield():这里创建了一个生成器对象,调用 generator_with_yield() 函数并将其赋值给变量 gen
  4. print(next(gen)):在生成器对象上调用 next() 函数,这会使生成器函数从头开始执行,生成第一个值并返回。每次调用 next(),生成器函数都会继续执行,直到遇到下一个 yield 语句为止。
  5. result = function_with_return():在普通函数上调用,它会执行函数内部的代码,生成并返回一个列表。
  6. 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 示例中每一步的含义

  1. def accumulator()::这是一个生成器函数的定义,命名为 accumulator。它没有参数。
  2. total = 0:这是累加器的初始化,开始时总和为 0。
  3. while True::这是一个无限循环,表示生成器函数会一直执行,直到外部调用方主动关闭生成器。
  4. value = yield total:这是 yield 语句,它会生成当前的总和值,并暂停函数的执行。在每次迭代中,生成器会生成一个值并将控制权返回给调用方。同时,它也是一个接收来自外部的值的地方,通过 send() 方法向生成器发送值。
  5. if value is not None::这是一个条件语句,检查发送的值是否为 None,如果不是 None,则表示有新的值要累加到总和中。
  6. total += value:这是将新值累加到总和中的步骤。
  7. acc_gen = accumulator():这里创建了一个生成器对象,调用 accumulator() 函数并将其赋值给变量 acc_gen
  8. next(acc_gen):这是启动生成器的步骤,通过 next() 函数开始执行生成器函数,使其执行到第一个 yield 语句处暂停。
  9. 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 示例中每一步的含义

  1. def catcher()::这是一个生成器函数的定义,命名为 catcher。它没有参数。
  2. try::这是一个 try 块,表示生成器函数会尝试执行其中的代码。
  3. while True::这是一个无限循环,表示生成器函数会一直执行,直到外部调用方主动关闭生成器。
  4. try::这是内部的 try 块,用于捕获可能在 yield 语句周围发生的异常。
  5. value = yield:这是 yield 语句,它会暂停函数的执行,并等待外部发送的值。在每次迭代中,生成器会生成一个值并将控制权返回给调用方。
  6. except ValueError as ve::这是一个 except 块,用于捕获特定类型的异常(在这里是 ValueError)。
  7. print("Received:", value):这是打印接收到的值的步骤。
  8. except GeneratorExit::这是一个特殊的 except 块,用于捕获生成器关闭时的异常。
  9. gen = catcher():这里创建了一个生成器对象,调用 catcher() 函数并将其赋值给变量 gen
  10. next(gen):这是启动生成器的步骤,通过 next() 函数开始执行生成器函数,使其执行到第一个 yield 语句处暂停。
  11. gen.throw(ValueError("Invalid value")):在生成器对象上调用 throw() 方法,抛出一个 ValueError 异常。
  12. gen.send(10):继续在生成器中发送值,这里发送了一个整数值 10。
  13. 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

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…...

5月4(信息差)

&#x1f384; HDMI ARC国产双精度浮点dsp杜比数码7.1声道解码AC3/dts/AAC环绕声光纤、同轴、USB输入解码板KC33C &#x1f30d; 国铁集团回应高铁票价将上涨 https://finance.eastmoney.com/a/202405043066422773.html ✨ 源代码管理平台GitLab发布人工智能编程助手DuoCha…...

【Spring】1.Spring中IOC与DI全解析

本节将详细介绍Spring框架的两个核心概念&#xff1a;控制反转&#xff08;IOC&#xff09;和依赖注入&#xff08;DI&#xff09;。首先&#xff0c;我们会探讨IOC和DI的定义&#xff0c;实现原理&#xff0c;优点和缺点。然后&#xff0c;我们将介绍如何在Spring中使用IOC和D…...

vue2迁移到vue3,v-model的调整

项目从vue2迁移到vue3&#xff0c;v-model不能再使用了&#xff0c;需要如何调整&#xff1f; 下面只提示变化最小的迁移&#xff0c;不赘述vue2和vue3中的常规写法。 vue2迁移到vue3&#xff0c;往往不想去调整之前的代码&#xff0c;以下就使用改动较小的方案进行调整。 I…...

【C语言】解决不同场景字符串问题:巧妙运用字符串函数

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、字符函数1.1 字符分类函数1.1.1 islower1.1.2 isupper 1.…...

android 如何显示网络地址对应的图片

1.android 如何显示网络地址对应的图片 在Android中显示网络地址对应的图片&#xff0c;通常有多种方法可以实现。以下是几种常见的方法&#xff1a; 1. 使用ImageView和Picasso库 Picasso是一个强大的图片加载库&#xff0c;它可以方便地加载网络图片并显示到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课程分类表的结构 这张表是一个树型结构&#xff0c;通过父结点id将各元素组成一个树。 利用mybatis-plus-gen…...

Android SQLite中的UNIQUE constraint failed错误

报错信息&#xff1a; UNIQUE constraint failed SQLite中的UNIQUE constraint failed错误&#xff0c;表明尝试插入或更新数据库时出现了违反唯一性约束的情况。唯一性约束确保在特定列或列集合中的值在表中是唯一的&#xff0c;即不能有重复的值。当你尝试插入或更新已存在于…...

嘴尚绝卤味:传承经典,缔造美食新风尚

卤味&#xff0c;作为中国传统美食的代表之一&#xff0c;历经千年的传承与发展&#xff0c;早已成为无数食客餐桌上的宠儿。而在这个美食盛行的时代&#xff0c;嘴尚绝卤味凭借其独特的口感和精湛的工艺&#xff0c;成为卤味市场中的佼佼者&#xff0c;引领着卤味文化的新潮流…...

Docker 入门与实践:从零开始构建容器化应用环境

Docker 一、docker常用命令docker ps 格式化输出Linux设置命令别名 二、数据卷相关命令挂载到默认目录&#xff08;/var/lib/docker&#xff09;挂载到本地目录 三、自定义镜像Dockerfile构建镜像的命令 四、网络自定义网络 五、DockerCompose相关命令 一、docker常用命令 dock…...

C# 用户控件UserControl事件解绑资源释放

用户控件继承子 UserControl 。 现在有个业务需求在UserControl 所在的窗体关闭时解除事件HMouseDown绑定。 因没有相关的Close事件。后来本人想了一个办法在 ROICtlDesigner类的 Dispose 方法中执行相关的释放代码 比如解除事件绑定 释放资源 public partial class ROICt…...

QT-QTCreator环境配置

准备工作&#xff1a; 下载QT: 链接&#xff1a;https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码&#xff1a;60b3下载WindowsKits&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码&#xff1a;e2h8安装的…...

最大连续和

【问题描述】 对于一个具有n个元素的整型数组 a&#xff0c;求具有最大连续和的子数组&#xff08;最少具有一个元素&#xff09;。 【输入形式】 输入的第一行为一个整数 n&#xff0c;接下来的一行为 n 个整数&#xff0c;表示数组的元素。 【输出形式】 输出具有最大连续和的…...

分布式系统事务一致性解决方案(基于事务消息)

参考&#xff1a;https://rocketmq.apache.org/zh/docs/featureBehavior/04transactionmessage/ 文章目录 概要错误的方案方案一&#xff1a;业务方自己实现方案二&#xff1a;RocketMQ 事务消息什么是事务消息事务消息处理流程事务消息生命周期使用限制使用示例使用建议 概要 …...

Unity Animation--动画剪辑

Unity Animation--动画剪辑 动画剪辑 动画剪辑是Unity动画系统的核心元素之一。Unity支持从外部来源导入动画&#xff0c;并提供创建动画剪辑的能力使用“动画”窗口在编辑器中从头开始。 外部来源的动画 从外部来源导入的动画剪辑可能包括&#xff1a; 人形动画 运动捕捉…...

如何将 redis 快速部署为 docker 容器?

部署 Redis 作为 Docker 容器是一种快速、灵活且可重复使用的方式&#xff0c;特别适合开发、测试和部署环境。本文将详细介绍如何将 Redis 部署为 Docker 容器&#xff0c;包括 Docker 安装、Redis 容器配置、数据持久化、网络设置等方面。 步骤 1&#xff1a;安装 Docker 首…...

iOS - Undefined symbols: 解决方法

Undefined symbols: 是让人苦恼的报错&#xff0c;如何知道是 哪个 symbols 不对呢&#xff1f; 今天探索到下面的方法&#xff1a; 1、点击导航上方 最右侧的按钮&#xff0c;查看历史报错 2、选中报错信息&#xff0c;右键选择 Expand All Transcripts 在出现的详细信息面…...

优化理论复习——(三)

本篇介绍无约束优化的问题&#xff0c;通过四种算法来进行求解的过程和思路&#xff0c;也是最优化方法中的最重要的一类问题。 无约束优化问题主要是通过迭代搜索算法来切结&#xff0c;比线性规划的计算量都小一点。 目录 无约束优化问题最优性条件最速下降法牛顿法共轭梯度…...

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章&#xff0c;转载请注明原文出处。 此实验参考 《鲁班猫监控检测》&#xff0c;原代码有点BUG&#xff0c;已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...