生成器、迭代器、可迭代对象

生成器、迭代器、可迭代对象

生成器

函数体中包含yield关键字的就是生成器
把生成 器传给 next(...) 函数时,生成器函数会向前,执行函数定义体中的 下一个 yield 语句,返回产出的值,并在函数定义体的当前位置暂停。等到再次遇到next才会继续执行。

简单生成器示例
def demo_gen():yield 1yield 2yield 3
gen = demo_gen()
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))  # 当生成器的值取完了,在使用next方法,会抛出StopIteration错误
生成器表达式

生成器表达式是语法糖:完全可以替换成生成器函数,不过有时使用生成器表达式更便利。

代码在ipython(安装:pip install ipython)运行的

In [1]: (i for i in range(10))
Out[1]: <generator object <genexpr> at 0x107798200>
类示例代码:
class Sentence:"""简单的生成器,使用yield关键字"""def __init__(self, text):self.text = textself.words = RE_WORD.findall(self.text)def __iter__(self):for word in self.words:yield word

迭代器

使用while循环模拟迭代器
s = 'ABC'
it = iter(s)
while True:try:print(next(it))except StopIteration:del itbreak
实现迭代器的必备方法
  1. __next__

    返回下一个可用的元素,如果没有元素了,抛出StopIteration异常。

  2. __iter__

    返回self,以便在应该使用可迭代对象的地方使用迭代器,例如for循环中。

实现代码:
class IterableDemo:def __init__(self, text):self.text = textself.index = 0def __iter__(self):return iter(self)def __next__(self):"""next方法的获取逻辑"""try:word = self.text[self.index]except IndexError:raise StopIterationself.index += 1return wordif __name__ == '__main__':it = IterableDemo('Hello,world')print(next(it))print(next(it))print(next(it))

可迭代对象

可迭代对象是指可以通过__iter____getitem__方法访问。

其中__getitem__方法没有办法通过issubclass(Sentence, Iterable)判断。

解释器需要迭代对象x时,会自动调用iter(x)

from collections.abc import Iterableclass Sentence:def __iter__(self):return iter(self)print(issubclass(Sentence, Iterable)) # == Trueclass Sentence:def __getitem__(self, index):return self.words[index]print(issubclass(Sentence, Iterable)) # == False
实现__getitem__方法

如果只实现了__getitem__方法,Python会创建一个迭代器,尝试按顺序(从索引0开始)获取元素。

如果尝试失败会返回C object is not iterable(C对象不可迭代),其中C对象就是所属的类。

def __getitem__(self, index):return self.words[index]
实现__iter__方法
def __iter__(self):return iter(self.words)
示例代码:
class Sentence:def __init__(self, text):self.text = textself.words = RE_WORD.findall(self.text)def __iter__(self):return iter(self.words)# def __getitem__(self, index):#     return self.words[index]def __len__(self):return len(self.words)def __str__(self):return 'Sentence(%s)' % reprlib.repr(self.words)s = Sentence('Hello world how are you')
for word in s:print(word)

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

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

相关文章

深度学习与神经网络:从基础到前沿

深度学习与神经网络是人工智能领域中的重要分支&#xff0c;其应用范围涵盖图像识别、语音识别、自然语言处理等多个领域&#xff0c;对于推动人工智能技术的发展具有重要意义。本文将从深度学习的基础原理开始&#xff0c;逐步探讨神经网络的结构、训练方法&#xff0c;以及在…

认识 Redis 与 分布式

Redis 官网页面 Redis官网链接 Redis 的简介 Redis 是一个在内存中存储数据的中间件 一方面用于作为数据库&#xff0c;另一方面用于作为数据缓存&#xff0c;适用于分布式系统中 Redis 基于网络&#xff0c;进行进程间通信&#xff0c;把自己内存中的变量给别的进程&#xf…

Leetcode 300. 最长递增子序列

心路历程&#xff1a; 经典的子串/子序列的DP问题&#xff0c;这道题需要按照最后一个元素包含在子序列的角度去建模比较好做。 状态&#xff1a;以nums[i]为结尾的最长严格递增子序列的长度 动作候选集&#xff1a;每一个[0, i)之间满足比nums[i]小的元素 返回值&#xff1a…

Python超市商品管理系统

系统需要用户先登录&#xff0c;再进行操作&#xff0c;其中包含一下功能菜单 1、显示商品列表 2、增加商品信息 3、删除商品 4、设置商品折扣 5、修改商品价格信息 6、退出 a、使用列表嵌套字典的方式保存用户数据&#xff08;包含用户名、密码、姓名&#xff09;&#xff1…

C#/WPF Inno Setup打包程序

Inno Setup介绍 Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年&#xff0c;现在已经更新到Inno Setup 6了。Inno Setup是一个十分简单实用的打包小工具&#xff0c;可以按照我们自己的意愿设置功能&#xff0c;稳定性也很好。 官方网址&#xff1…

F - 创新型机器猫 高性能战斗机器人(遇到过的题,做个笔记)

我的代码&#xff1a; #include <iostream> #include <vector> using namespace std; int main() {string str;cin >> str;int dxy[][2] { {0,1},{1,0},{0,-1},{-1,0} }; //设置偏移量&#xff0c;按照右转顺序&#xff1a;北->东->南->西int now…

mvn怎么安装jar

要在 Maven 项目中安装一个 JAR 文件到本地 Maven 仓库&#xff0c;您可以使用 Maven 的 install:install-file 命令。这个命令可以将指定的 JAR 文件安装到本地 Maven 仓库中&#xff0c;以便在项目中引用。 下面是使用 install:install-file 命令安装 JAR 文件的基本语法&am…

Spring Boot 集成 RabbitMQ(一)

1、RabbitMQ 和 SpringBoot 的基础概念 RabbitMQ 是一个开源的 MQ &#xff08;Message Queue&#xff0c;消息队列&#xff09; 客户端服务器实现&#xff0c;遵循 AMQP(Advanced Message Queuing Protocol)协议。它允许应用发送消息并不直接传递到目标对象&#xff0c;而是通…

RabbitMQ3.7.8集群分区(脑裂现象)模拟及恢复处置全场景测试

测试环境准备: MQ服务器集群地址&#xff0c;版本号为3.7.8&#xff1a; 管理控制台地址:http://173.101.4.6:15672/#/queues 集群状态 rabbitmqctl cluster_status 集群操作相关命令: 创建一个RabbitMQ集群涉及到如下步骤&#xff1a; 安装RabbitMQ&#xff1a; 在每台要在集…

【opencv】教程代码 —photo

将彩色图像转换为去色图像&#xff08;灰度图像&#xff09;和 颜色增强图像 HDR 图像合成&#xff0c;并同时执行色调映射和曝光融合非真实感渲染&#xff08;NPR&#xff09;正常克隆、混合克隆、单色传递、局部颜色改变、局部照明改变和纹理平滑 1. decolorization将彩色图像…

微信小程序 电影院售票选座票务系统5w7l6

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…

竞赛 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…

分布式数据库中间件 Mycat 和 ShardingSphere 对比

Mycat 和 ShardingSphere 都是流行的分布式数据库中间件&#xff0c;都可以用于实现数据分片、读写分离和分布式事务等功能&#xff0c;但它们在设计理念、特点和功能实现上有一些区别 1. 设计理念&#xff1a; Mycat&#xff1a; 基于 MySQL 协议的代理式架构&#xff0c;主要…

前端进阶之最长递增子序列算法和vue.js中的Diff算法

前端进阶之最长递增子序列算法和vue.js中的Diff算法 最长递增子序列 什么是子序列 子序列的概念派生自数组&#xff0c;通过删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序&#xff0c;得到的数组就是原数组的子序列。 例如&#xff0c;[3,6,2,7]…

Flutter仿Boss-4.短信验证码界面

效果 简述 在移动应用开发中&#xff0c;处理短信验证码是确保用户身份验证和安全性的重要步骤。本文将介绍如何使用Flutter构建一个短信验证码界面&#xff0c;让用户输入通过短信发送到他们手机的四位验证码。 依赖项 在这个项目中&#xff0c;我们将使用以下依赖项&#…

vue快速入门(六)v-else和v-else-if

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-else-if用法v-else用法 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

枚举类练习

练习一 案例&#xff1a;使用枚举类实现单例模式 package chapter08_oop3_teacher.src.com.atguigu10._enum.exer1;/*** ClassName: BankTest1* Description:** Author 尚硅谷-宋红康* Create 15:05* Version 1.0*/ public class BankTest1 {public static void main(String[]…

Excel、PowerQuery 和 ChatGPT 终极手册(上)

原文&#xff1a;Ultimate ChatGPT Handbook for Enterprises 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 在不断发展的数据管理和分析领域中&#xff0c;掌握 Excel 的查找功能不仅是一种技能&#xff0c;更是高效数据处理的基石。《使用 Power Query 和 Ch…

论文阅读:Walk These Ways: 通过行为多样性调整机器人控制以实现泛化

Walk These Ways: 通过行为多样性调整机器人控制以实现泛化 摘要&#xff1a; 通过学习得到的运动策略可以迅速适应与训练期间经历的类似环境&#xff0c;但在面对分布外测试环境失败时缺乏快速调整的机制。这就需要一个缓慢且迭代的奖励和环境重新设计周期来在新任务上达成良…

Django模板层——三种自定义模板simple_tag、inclusion_tag、filter的用法

目录 1. 前言 2. 前置操作 3. simple_tag 3.1 注意点 4. inclusion_tag 5. filter 6. 结尾 1. 前言 在前后端不分离的模式中&#xff0c;Django的模板语法尤为重要&#xff0c;我们可以动态传入变量&#xff0c;并在前端HTML中进行展示。在变量展示时&#xff0c;会有一…