24. 生成器

一、什么是生成器

  利用迭代器,我们可以每次迭代获取数据(通过 next() 方法)时按照特定的规律进行生成。但是在实现一个迭代器时,关于当前迭代的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。为了达到记录当前状态,并配合 next() 函数进行迭代使用。简而言之,迭代器时可以实现在循环的过程中生成数据时,但是稍微有些复杂。

class PointXY:def __init__(self):self.x = 0self.k = 2self.b = 1def __iter__(self):return selfdef __next__(self):# y = kx + btemp_y = self.k * self.x + self.btemp_point_x_y = (self.x, temp_y)self.x = temp_yreturn temp_point_x_ydef change_k_b(self, k, b):self.k = kself.b = bpoint_x_y = PointXY()
point_x_y_iter = iter(point_x_y)i = 0
while i < 5:if i == 3:point_x_y.change_k_b(3, 2)point_x_y_value = next(point_x_y_iter)print(point_x_y_value)i += 1

  我们可以使用生成器简化这个过程,生成器就是一类特殊的迭代器。生成器只记录生成数据的方式(算法),而不是事先生成存储这些数据,这种方式就称之为 生成器(generator)。

  在函数内,我们可以使用 yield 关键字时,调用该函数时并不会执行函数体代码,而是会返回一个生成器对象。调用生成器的 __next__() 方法会触发函数体代码的运行,然后遇到 yield 停下来,将 yield 后的值当做本次调用的结果返回。

  第一次执行时,则从函数开头开始执行,直到遇到 yield 关键字为止,并且把 yield 关键字后的数值返回,当作 next() 方法的返回值。如果不是第一次执行,则从上一次暂停的位置执行(即上一次 yield 关键字的下一条语句开始执行),直到遇到下一个 yield 关键字为止,并且将 yield 关键后的数值返回,当作 next() 方法的返回值。

  如果在调用 next() 方法时,从上一次暂停的地方继续向下执行,遇不到 yield 关键字,那么就会产生 StopIterationStop 异常。如果在调用 next() 方法时,接下来没有遇不到 yield 关键字,而是遇到 return关键字,那么就会产生 StopIterationStop 异常,并且会把 return 的数值用异常对象暂时存储起来。

def func():print("第一次执行!")yield 1print("第二次执行!")yield 2print("第三次执行!")yield 3print("第四次执行!")return 4generate = func()
print(generate)
print(type(generate))
print()while True:try:result = next(generate)print(result)except StopIteration as e:print(e.value)break

只要函数有 yield 关键字,就是生成器对象;

二、yield表达式

  如果想要生成器继续向下开始运行,我们可以使用 nest() 方法或 send() 方法,它们都会让生成器继续向下运行。并且,如果运行时,遇不到 yield 关键字都会产生异常。不同的是,next() 方法只会让运行继续开始,而 send() 方法除了让其开始运行之外,还可以将某个数据携带过去。

def dog(name):fodd_list = []print("小狗开始吃东西啦。")while True:# x拿到的是yield接收到的值x = yield fodd_listprint(f"小狗{name}吃了{x}")fodd_list.append(x)generate = dog("旺财")# 首次使用send()方法时不能传值
result = generate.send(None)         # 相当于next(generate)
print(result,end="\n\n")result = generate.send("大骨头")
print(result,end="\n\n")result = generate.send("肉包子")
print(result,end="\n\n")generate.close()
#result = generate.send("骨头汤")     # 关闭以后无法传值

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

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

相关文章

软件测试等级说明

Level 0 (冒烟测试-Smoke Test)&#xff1a;位于最顶部&#xff0c;是所有测试的基础&#xff0c;用来快速验证新构建是否稳定。Level 1 (基本功能测试)&#xff1a;在冒烟测试之下&#xff0c;它比冒烟测试更深入&#xff0c;确保主要功能按预期工作。Level 2 (集成测试)&…

【Hadoop】-- hadoop3.x default port

Hadoop 3.x 修改了一些以前常用的默认端口,完整的默认端口列表,可点击下面配置文件获取信息: core-default.xmlhdfs-default.xmlhdfs-rbf-default.xmlyarn-default.xml

【go语言】regexp包,正则表达式

Go语言 regexp 包详解 Go 语言的 regexp 包提供了对正则表达式的支持。 正则表达式&#xff08;regex&#xff09;是一种字符串搜索模式&#xff0c;用来检查一个字符串是否符合某种特定的模式&#xff0c;或从中提取符合某种模式的子字符串。 1. regexp 包概述 regexp 包支…

【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园

目录 [[数字花园]]的构建原理包括三个步骤&#xff1a;五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园&#xff08;在线个人知识库&#xff09;的经历&#xff0c;首先尝试的是网上普遍使用的方法&#xff0c;也就是本篇文章介绍的。 后面会继续…

《探秘开源气味数据库:数字世界里的“气味宝藏”》

《探秘开源气味数据库&#xff1a;数字世界里的“气味宝藏”》 一、开源气味数据库的兴起背景&#xff08;一&#xff09;技术发展的推动&#xff08;二&#xff09;市场需求的催生 二、常见的开源气味数据库介绍&#xff08;一&#xff09;GS-LF 香精香料数据库&#xff08;二…

【0x000C】HCI_Link_Key_Request_Negative_Reply 命令详解

目录 一、命令概述 二、命令格式及参数说明 2.1. HCI_Link_Key_Request_Negative_Reply命令格式 2.2. BD_ADDR 三、返回事件及参数 3.1. 生成的事件 3.2. BD_ADDR 2.3. Status 四、命令执行流程场景 4.1. 命令触发条件 4.2. 命令组装与发送 4.3. 控制器接收与处理 …

C#里怎么样删除字典里多项元素?

当我们使用字典比较多的情况,一般来说,就是为了提高查询的速度。 比如一个服务器,有多个TCP连接上来,每次要通过IP地址来访问这些连接对象, 就需要查找。 如果采用列表来保存,就只能遍历来查询到连接对象。 如果采用字典,就可以快速地通过字典键来查询到对象,其实这…

数字产业化和产业数字化到底是什么?

“数字产业化”和“产业数字化”在很多官方文件和领导人讲话中都是成对出现的&#xff0c;这两个术语看起来非常相似&#xff0c;但它们作为数字经济的两个重要组成部分&#xff0c;既有联系又有区别。 在谈数字产业化和产业数字化之前&#xff0c;我这里需要先给大家介绍一个概…

mysql、postgresql、oceanbase调优

一、mysql 1、my.cnf [mysqld_safe] log-error=/data/mysql/log/mysql.log pid-file=/data/mysql/run/mysqld.pid[client] socket=/data/mysql/run/mysql.sock default-character-set=utf8[mysqld] basedir=/usr/local/mysql tmpdir=/data/mysql/tmp datadir=/data/mysql/dat…

npm或yarn包配置地址源

三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装&#xff1a;yarn install 注意…

文件上传之黑名单检测

一般情况下&#xff0c;代码文件里会有一个数组或者列表&#xff0c;该数组或者列表里会包含一些非法的字符或者字符串&#xff0c;当数据包中含有符合该列表的字符串时&#xff0c;即认定该数据包是非法的。 ​​ 一.如何判断是否为黑名单检测 黑名单是有限的&#xff0c;可以…

扩展tinyplay使其自适应不同声道数量的媒体

android原来的tinyplay代码&#xff0c;如果遇到播放媒体的 声道数量与打开pcm的声道数量不匹配的情况&#xff0c;会没法继续播放。 本例扩展了tinyplay的代码&#xff0c;将不同声道的音频数据展开/压缩到pcm设备支持的数据&#xff0c;再写入pcm设备。 bplay.c #include &…

光控资本:锂电排产上行 AI手机有望快速渗透

AI手机有望快速渗透 据赛迪参谋猜想&#xff0c;2024年AI手机的出货量估量将会抵达1.5亿部&#xff0c;占全球智能手机总出货量13%&#xff0c;到2027年&#xff0c;全球AI手机销售量有望跨过5.9亿部&#xff0c;占全球智能手机总出货量的比重跨过50%。 跟着硬件根底夯实、端侧…

el-table 动态计算合并行

原始表格及代码 <el-table:data"tableData"class"myTable"header-row-class-name"tableHead" ><el-table-column prop"date" label"日期"> </el-table-column><el-table-column prop"name" …

druid.properties图标是齿轮

一、问题 在IDEA中&#xff0c; druid.properties图标是齿轮 二、原因 2023版本开始&#xff0c;IDEA新的UI的问题 三、解决方法 1、点击右上角的齿轮图标 2、点击Settings 3、Appearance & Behavior---->New UI---->取消勾选“Enable new UI”---->右下角OK 4…

龙海家园地面停车场探寻2

在南山前海上班2年多了&#xff0c;到现在最喜欢的小区还是龙海家园小区。龙海家园小区是深圳目前最大的公共保障性租赁住房小区,目前居住有约2.6万人。而小区的停车位是远远不够的。之前一直很好奇车子可以停哪里。 后面加班之余经常去小区吃饭和转转。发现龙海家园小区与对面…

群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由 在根目录下route文件夹下修改app.php文件&#xff0c;代码如下&#xff1a; // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…

SQLite Update 语句

SQLite Update 语句 SQLite 的 UPDATE 语句用于更新数据库表中的现有记录。使用 UPDATE 语句&#xff0c;您可以修改一个或多个列的值。本教程将详细介绍如何使用 SQLite UPDATE 语句&#xff0c;包括语法、示例以及一些最佳实践。 语法 SQLite UPDATE 语句的基本语法如下&a…

SQL 单表查询练习题(一)

在 SQL 的学习过程中&#xff0c;单表查询是非常重要的基础部分&#xff0c;下面为大家分享一些单表查询的练习题以及对应的正确答案&#xff0c;希望能帮助大家更好地掌握相关知识。 一、题目及答案详情 1. 查询课程表中&#xff0c;没有前序课程的课程信息&#xff0c;查询…

评估一套呼叫中心大模型呼出机器人的投入回报比?

评估一套呼叫中心大模型呼出机器人的投入回报比&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 评估一套呼叫中心大模型呼出机器人的投入回报比&#xff08;ROI&#xff09;&#xff0c;是一个涉…