yield关键字

如果是第一次遇到这个关键字,可以直接使用下文中小标题为Next的代码设置断点看一下效果

  1. yield的函数是一个生成器,而不再是一般意义上的一个函数。yield在函数中的功能类似于return,不同的是yield每次返回结果之后函数并没有退出,而是 每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用。
  2. 包含yield的函数成为一个生成器(一开始不运行,而是得到一个对象),生成器同时也是一个迭代器,支持通过next方法获取下一个值。
  3. 使用yield的好处是通过使用生成器,避免占用内存,提高运行效率。

适用场景:一个函数需要多次循环执行一个动作,并且每次执行的结果都是需要的

示例

def foo():print("starting...")while True:result = yield 4print("result:", result)test = foo()
print(next(test))
print("*"*20)
print(next(test))

输出

starting...
4
********************
result: None
4

代码分析:

(1) 针对test = foo(),由于函数foo中存在yield关键字,所以函数foo内的代码一开始并不执行,而是得到一个生成器test(相当于一个对象)。

(2) 针对print(next(test))。由于调用了next方法,foo函数开始执行。先输出starting...,然后进入while循环。在循环内,遇到yield关键字。这里可以把yield想象成return。因此,foo函数返回4,并通过print函数输出。注意:这里并没有执行result的赋值操作。

(3) 针对print("*"*20)。程序输出20个星号。

(4)针对print(next(test))。这句代码是接着步骤(2)结束的地方开始执行,执行的是result的赋值操作。注意:由于在步骤(2)的时候,4已经return出去,并没有完成赋值操作。因此,现在给result赋的值是None。所以输出的结果是result: None。程序接着在While内继续执行,又一次碰到yield关键字,同样返回4,并通过print函数输出。

总结一下,带yield的函数是一个生成器,而不再是一般意义上的一个函数了,这个生成器有一个方法就是next方法,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以第二次调用next的时候,生成器并不会从foo函数最开始的地方执行,而是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。

Next

def count_up_to(limit):count = 1while count <= limit:yield countcount += 1# 使用生成器函数
generator = count_up_to(5)# 调用 next() 函数获取生成器的下一个值
print(next(generator))  # 输出 1
print(next(generator))  # 输出 2
print(next(generator))  # 输出 3
print(next(generator))  # 输出 4
print(next(generator))  # 输出 5
# 超过 limit,再次调用将抛出 StopIteration 异常
# 如果在循环中使用,可以通过捕获异常来结束循环
# 或者使用 for 循环,它会自动处理 StopIteration 异常

Send

除了next方法,yield得到的生成器还支持send方法。该方法可以向生成器传递参数。

python yield用法 (baidu.com)

避免占用内存

  1. 通常的for…in…循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist 
    = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。 它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。
  2. 生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成。比如 mygenerator = (x*x for x in range(3)),注意这里用到了(),它就不是数组,而上面的例子是[]。

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

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

相关文章

clang--cpplint--gitlint

clang_format clang_format是什么 代码格式化工具 官网和教程 下载 sudo apt install clang sudo apt install clang-format#查看下载是否成功 clang --version 代码的构建到提交的过程&#xff1a; cmake .. make make test make clang_format_check cpplint cpplin…

Vue3中的ref和shallowRef、reactive和shallowReactive

一&#xff1a;ref、reactive简介 ref和reactive是Vue3中定义响应式数据的一种方式。ref通常用来定义基础类型数据。reactive通常用来定义复杂类型数据。 二、shallowRef、shallowReactive简介 shallowRef和shallowReactive是Vue3中定义浅层次响应式数据的方式 三、Api使用对比…

Mac中java jdk、android sdk、flutter sdk目录

1、Java JDK 目录 &#xff08;1&#xff09;官网下载的 Java JDK Java JDK下载官网 /Library/Java/JavaVirtualMachines&#xff08;2&#xff09;Android Studio下载的 Java JDK /Users/用户名/Library/Java/JavaVirtualMachines2、Android SDK 目录 /Users/用户名/Libr…

ansible处理多台机器部署基础环境

本次以多台机器需部署zabbix客户端为例&#xff1a; 机器先做免密互信&#xff0c;ansible主机上执行ssh-keygen,一路回车&#xff0c;然后将公钥发送给需管理的主机&#xff1a; ssh-copy-id rootIP 1、编辑hosts文件&#xff0c;添加需配置的主机IP&#xff0c;并测试连通…

Android10.0 SystemUI 下拉通知栏去掉左右滑动菜单

1.前言 在10.0的系统产品定制化开发中,在systemui的下拉状态栏部分,包括qspanel部分和通知栏部分,而在下拉通知栏的相关事件中, 通知栏左滑右滑都可以设置按钮等 来跳转到系统设置页面,所以产品开发需要,要求去掉通知栏通知左右滑动显示系统设置图标功能 禁止进入到系统…

Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践

背景&#xff1a;在某个嵌入式上的图像处理项目功能开发告一段落&#xff0c;进入性能优化阶段。尝试从多线程上对图像处理过程进行加速。经过初步调研后&#xff0c;可以从OPENMP&#xff0c;TBB这两块进行加速&#xff0c;当前项目中有些算法已采用多线程加速&#xff0c;这次…

FRDM‐K64F开发板 ARM Mbed 在线编译器嵌入式和物联网开发

传感器和执行器 传感器是将物理参数转换为电输出的设备。 传感器是换能器的一种。 传感器可分为模拟传感器和数字传感器。 模拟传感器以电压和电流的形式提供输出。 微控制器需要 ADC&#xff08;模数转换器&#xff09;读取来自模拟传感器的数据。 许多较新的传感器都是数字传…

僵尸进程以及解决办法、僵死进程有什么区别?

僵尸进程是指已经结束但父进程没有回收它的资源的进程。它们在进程表中仍占有一个位置&#xff0c;但不能被调度运行。僵尸进程会浪费系统的资源&#xff0c;如果过多&#xff0c;可能导致系统无法创建新的进程。僵尸进程的产生原因是父进程没有及时调用 wait 或 waitpid 函数来…

【蓝桥杯冲冲冲】[NOIP2000 提高组] 方格取数

蓝桥杯备赛 | 洛谷做题打卡day19 文章目录 蓝桥杯备赛 | 洛谷做题打卡day19[NOIP2000 提高组] 方格取数题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题解代码我的一些话 [NOIP2000 提高组] 方格取数 题目背景 NOIP 2000 提高组 T4 题目描述 设有 N N…

如何用甘特图跟踪项目进度

甘特图是一个简单但是极其强大的项目管理工具,能够清晰可视化复杂项目的进度,在项目跟踪和控制上发挥重要作用。任何一个严肃的项目组织者都会使用甘特图来规划和管理项目中的任务。 甘特图的纵坐标表示项目的各项活动或任务,横坐标表示项目的时间进度。每个任务用一条横条表示…

Java【代码 16】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理

word、excel、pdf、image转换工具类 1.感谢2.包含的工具类3.lib文件说明3.1 使用的3.2 未使用的 4.核心代码4.1 WordToPdfUtil4.2 ExcelToPdfUtil4.3 PdfToImageUtil 6.问题处理6.1 Word中文无法转换6.2 Excel中文无法转换 7.总结 1.感谢 感谢小伙伴儿的分享&#xff1a; ● 不…

使用vs2022将.net8的应用程序发布为一个单独文件

在使用.NetCore3.1时&#xff0c;可以通过设置以下工程配置文本来将项目发布为一个单独的应用程序文件&#xff1a; <Project Sdk"Microsoft.NET.Sdk.WindowsDesktop"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><…

permanent property翻译为永久产权属于错误,应该是正式产权、法定产权

很多人说美国房子是永久产权。再配上“风能进&#xff0c;雨能进&#xff0c;国王不能进”&#xff0c;于是给人一种误解&#xff0c;就是永远所有。现实性是什么呢&#xff1f;你今天不交房产税、物业费&#xff0c;明天就被拍卖。这就是所谓的永久产权&#xff1f;显然不是。…

MySQL新类型JSON的用法讲解

前言 MySQL相信大家应该不陌生吧&#xff0c;都知道MySQL有很多数据类型&#xff0c;包括int&#xff0c;char&#xff0c;verchar&#xff0c;这些也是平时建表使用比较多的类型&#xff0c;在MySQL 8引入了新的数据类型——JSON&#xff0c;它使得在数据库中存储和查询 JSON…

QT容器分类与QSet应用

一.QT容器分类 Qt提供了多种容器类&#xff0c;大致可以分为以下几类&#xff1a; 1.顺序容器&#xff1a;这类容器按照线性顺序&#xff08;如列表或数组&#xff09;存储元素。例如&#xff0c;QList, QLinkedList, QVector, QStack, 和 QQueue。 2.关联容器&#xff1a;这…

LLM应用开发与落地:基于上下文的文本信息检测与提取

最近一直用LLM解决各种各样的问题&#xff0c;感觉已经脱离不了LLM了。每次使用LLM解决一个之前解决不了的问题&#xff0c;或者大大提升我的工作效率的时候&#xff0c;我内心都小小会激动一下。我想这是只通过看文章或只是研究AI理论感受不到的小确幸。我也因此更加确信LLM是…

react-jss书写样式

目录 react-jss的使用 react-jss的使用 实现组件化样式、动态样式、避免样式冲突 npm install react-jss yarn add react-jss// 使用 import React from react; import { createUseStyles } from react-jss;const useStyles createUseStyles({myButton: {color: green,margi…

Kotlin MultiPlatform:构建跨平台应用的未来

Kotlin MultiPlatform&#xff1a;构建跨平台应用的未来 1 引言 1.1 Kotlin MultiPlatform简介 Kotlin MultiPlatform&#xff08;简称KMP&#xff09;是一种由JetBrains开发的跨平台开发解决方案&#xff0c;它建立在Kotlin语言之上。KMP允许开发者使用一套Kotlin代码来构建…

【2024】Docker部署Redis

1.说明&#xff1a; 因为容器实例的运行是有生命周期的&#xff0c;一些redis的备份、日志和配置文件什么的最好还是放在服务器本地。这样当容器删除时&#xff0c;我们也可以保留备份和日志文件。所以先在本地服务器安装redis并配置文件设置。下面是安装步骤: 2.安装步骤 1…

Jmeter性能测试: 基于JDK 21 安装 Jmeter 5.6.3

目录 一、实验 1.环境 2.JDK下载 3.Jmeter下载 4.Windows安装JDK 21 5.Windows安装Jmeter 5.6.3 6.Linux安装JDK 21 7.Linux安装Jmeter 5.6.3 二、问题 1. Linux 的profile、bashrc、bash_profile文件有哪些区别 一、实验 1.环境 &#xff08;1&#xff09;主机 表…