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

【python】中的可迭代对象、迭代器、生成器

结论

  • 凡是实现了__iter__() 方法的类都称之为可迭代对象,但 __iter__() 方法的返回值只能是迭代器生成器
  • for 循环的本质是先调用 __iter__() 方法,然后不断调用返回值的 __next__() 方法,直至报出异常 StopIteration,可迭代对象的返回值一定是迭代器生成器,而迭代器生成器内部都具有 __next__() 方法,所以可迭代对象一定可以用于 for 循环
  • 凡是实现了 __iter__() 方法和 __next__() 方法的类都称之为迭代器
  • 凡是包含 yield 的函数都会自动生成一个同名的包含 __iter__() 方法和 __next__() 方法的类,这个类称之为生成器,所以生成器是一个特殊的迭代器
  • 在类中只要实现了 __getitem__(),则会自动生成 __iter__() 方法,所以凡是实现了__getitem__()方法的类也都称之为可迭代对象
  • 可迭代对象不一定是迭代器,但迭代器一定是可迭代对象

案例 1

凡是实现了__iter__() 方法的类都称之为可迭代对象,凡是实现了 __iter__() 方法和 __next__() 方法的类都称之为迭代器

from collections.abc import Iterator# 定义一个可迭代对象,同时也是迭代器
class MyClass1():def __init__(self, max_num):self.current = 0self.max_num = max_numdef __iter__(self):                       # 实现了__iter__()方法并不报错的类就是可迭代对象,对返回值类型有要求,否则报错return self                           # 并不要求必须返回self,只要是迭代器、生成器就可以,self本身是迭代器def __next__(self):                       # 同时实现了__iter__()和__next__()的类就是迭代器if self.current < self.max_num:val = self.currentself.current += 1return valelse:raise StopIteration               # __next__()方法中要求有StopIteration, 否则无法终止,但不是必须for value in MyClass1(3):                     # for循环的本质是先调用__iter__(),然后不断调用返回值的__next__(),直至报出异常StopIterationprint(value)
print(iter(MyClass1(3)))                      # iter(Myclass1(3))等效于Myclass1(3).__iter__()
print(isinstance(MyClass1(3), Iterator))
"""
0 1 2                                         # 可用for循环, 只要是可迭代对象都可以用for循环
<__main__.Myclass1 object at 0x79a05a1c7fd0>  # 说明是可迭代对象, 如果不是可迭代对象会报错
True                                          # 说明是迭代器
"""# 定义一个可迭代对象,同时也是迭代器
class MyClass2():def __init__(self, max_num):self.current = 0self.max_num = max_numdef __iter__(self):                       # 实现了__iter__()方法并不报错的类就是可迭代对象,对返回值类型有要求,否则报错return iter([3, 4, 5])                # 并不要求必须返回self,只要是迭代器、生成器就可以,iter(List)中包含__next__()方法def __next__(self):                       # 同时实现了__iter__()和__next__()的类就是迭代器if self.current < self.max_num:val = self.currentself.current += 1return valelse:raise StopIteration               # __next__()方法中要求有StopIteration, 否则无法终止,但不是必须for value in MyClass2(3):                     # for循环的本质是先调用__iter__(),然后不断调用返回值的__next__(),直至报出异常StopIterationprint(value)
object2 = MyClass2(3)
for _ in range(3):                            print(next(object2))                      # next(object2)等效于object2.__next__()
print(iter(MyClass2(3)))                      # iter(Myclass2(3))等效于Myclass2(3).__iter()__
print(isinstance(MyClass2(3), Iterator))
"""
3 4 5                                         # 可用for循环, 但for循环与自身的__next__()无关, 调用的是返回值的__next__()
0 1 2                                         # 自身的__next__()方法可以直接被调用, 超出取值范围会报出异常StopIteration
<list_iterator object at 0x7a2e7013bd90>      # 说明是可迭代对象, 如果不是可迭代对象会报错
True                                          # 说明是迭代器
"""       

案例 2

凡是实现了__iter__() 方法的类都称之为可迭代对象

from collections.abc import Iterator# 定义一个可迭代对象,但不是迭代器
class MyClass3():def __iter__(self):                       # 实现了__iter__()方法并不报错的类就是可迭代对象,对返回值类型有要求,否则报错return iter([0, 1, 2])                # 并不要求必须返回self,只要是迭代器、生成器就可以,iter(List)中包含__next__()方法for value in MyClass3():                      # for循环的本质是先调用__iter__(),然后不断调用返回值的__next__(),直至报出异常StopIterationprint(value) 
print(iter(MyClass3()))                       # iter(Myclass3())等效于Myclass3().__iter()__
print(isinstance(MyClass3(), Iterator))       # 类中没有实现自己的__next__(),所以不是迭代器,但能用在for循环的原因是调用了List的__next__()
"""
0 1 2                                         # 可用for循环, 只要是可迭代对象都可以用for循环
<list_iterator object at 0x7a2e7013bd90>      # 说明是可迭代对象, 如果不是可迭代对象会报错
False                                         # 说明不是迭代器, 没有实现自己的__next__()方法
"""

案例 3

在类中只要实现了 __getitem__(),则会自动生成 __iter__() 方法,所以凡是实现了__getitem__()方法的类也都称之为可迭代对象

from collections.abc import Iterator# 定义一个可迭代对象,但不是迭代器
class MyClass4():def __init__(self):self.data = [0, 1, 2]def __getitem__(self, index):             # __getitem__()方法会自动实现__iter__()方法,但不会自动实现__next__()方法return self.data[index]for value in MyClass4():                      # for循环的本质是先调用__iter__(),然后不断调用返回值的__next__(),直至报出异常StopIterationprint(value)
print(iter(MyClass4()))                       # iter(Myclass4())等效于Myclass4().__iter()__
print(isinstance(MyClass4(), Iterator))       # 类中没有实现自己的__next__(),所以不是迭代器,但能用在for循环的原因是调用了List的__next__()
"""
0 1 2                                         # 可用for循环, 调用的是返回值的__next__(), 返回值是iter(self.data)
<iterator object at 0x7172911bbd30>           # 说明是可迭代对象, 如果不是可迭代对象会报错
False                                         # 说明不是迭代器, 没有实现自己的__next__()方法
"""

案例 4

凡是包含 yield 的函数都会自动生成一个同名的包含 __iter__() 方法和 __next__() 方法的类,这个类称之为生成器,所以生成器是一个特殊的迭代器

from collections.abc import Iterator# 定义一个可迭代对象,但不是迭代器
class MyClass5():def __init__(self):self.data = [0, 1, 2]def __iter__(self):                       # 实现了__iter__()方法并不报错的类就是可迭代对象,对返回值类型有要求,否则报错for i in range(len(self.data)):       # 并不要求必须返回self,只要是迭代器、生成器就可以,包含yield返回生成器yield self.data[i]                # 不需要加异常StopIterationfor value in MyClass5():                      # for循环的本质是先调用__iter__(),然后不断调用返回值的__next__(),直至报出异常StopIterationprint(value)
print(iter(MyClass5()))                       # iter(Myclass5())等效于Myclass5().__iter()__
print(isinstance(MyClass5(), Iterator))       # 没有自己的__next__()所以不是迭代器
print(isinstance(iter(MyClass5()), Iterator)) # __iter__()返回值是一个生成器,生成器内部会自动实现自己的__iter__()方法和__next__()方法,详见下面fib()
"""
0 1 2                                                   # 可用for循环, 只要是可迭代对象都可以用for循环
<generator object MyClass5.__iter__ at 0x7a2e701e2350>  # __iter__()方法返回的是生成器, 说明是可迭代对象, 如果不是可迭代对象会报错
False                                                   # 说明不是迭代器, 但可以用for循环的原因是, 返回的生成器内部自动实现自己的__iter__()方法和__next__()方法
True                                                    # 包含yield语句的__iter__(self)自动生成一个生成器, 生成器也是一个类, 注意这个类是MyClass5内部的一个类
"""# 定义一个可迭代对象,同时也是迭代器
def fib(end=1000):                            # 自动构建一个名为fid的类,并自动构建__iter__()方法和__next__()方法,使之成为可迭代对象和迭代器prev, curr = 0, 1while curr < end:yield curr                            # 不需要加异常StopIterationprev, curr=curr, curr+prevfor value in fib():                           # for循环的本质是先调用__iter__(),然后不断调用返回值的__next__(),直至报出异常StopIterationprint(value)
object_fib = fib()
for _ in range(3):                            # 能用for循环,因为生成器自动构建__iter__()方法和__next__()print(next(object_fib))                   # next(object_fib)等效于object_fib.__next__()
print(iter(fib()))                            # iter(fib())等效于fib().__iter()__
print(isinstance(fib(), Iterator))            # 是迭代器,原因是生成器自动构建__iter__()方法和__next__()
"""
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987            # 说明生成器会自动构建__iter__()方法和__next__()方法
1 1 2                                         # 说明生成器会自动构建__next__()方法
<generator object fib at 0x7a2e701e2350>      # __iter__()方法返回的是生成器, 说明是可迭代对象, 如果不是可迭代对象会报错
True                                          # 是迭代器, 生成器是一个特殊的迭代器
"""

相关文章:

【python】中的可迭代对象、迭代器、生成器

结论 凡是实现了__iter__() 方法的类都称之为可迭代对象&#xff0c;但 __iter__() 方法的返回值只能是迭代器和生成器for 循环的本质是先调用 __iter__() 方法&#xff0c;然后不断调用返回值的 __next__() 方法&#xff0c;直至报出异常 StopIteration&#xff0c;可迭代对象…...

短视频矩阵系统源码/saas--总后台端、商户端、代理端、源头开发

短视频矩阵系统源码/saas--总后台端、商户端、代理端、源头开发 搭建短视频矩阵系统源码的交付步骤可以概括为以下几个关键环节&#xff1a; 1. **系统需求分析**&#xff1a;明确系统需要支持的功能&#xff0c;如短视频的上传、存储、播放、分享、评论、点赞等。 2. **技术选…...

K8s:二进制安装k8s(单台master)

目录 一、安装k8s 1、拓扑图 2、系统初始化配置 2.1关闭防火墙selinx以及swap 2.2设置主机名 2.3在每台主机中添加hosts&#xff0c;做映射 2.4调整内核参数&#xff0c;将桥接的ipv4流量传递到iptables&#xff0c;关闭ipv6 2.4时间同步 3、部署docker引擎&#xff0…...

C++类和对象下——实现日期类

前言 在学习了类和对象的六大成员函数后&#xff0c;为了巩固我们学习的知识可以手写一个日期类来帮助我们理解类和对象&#xff0c;加深对于其的了解。 默认函数 构造函数 既然是写类和对象&#xff0c;我们首先就要定义一个类&#xff0c;然后根据实际需要来加入类的数据与函…...

252 基于MATLAB的自适应差分阈值法检测心电信号的QRS波

基于MATLAB的自适应差分阈值法检测心电信号的QRS波&#xff0c;QRS波群反映左、右心室除极电位和时间的变化&#xff0c;第一个向下的波为Q波&#xff0c;向上的波为R波&#xff0c;接着向下的波是S波。通过GUI进行数据处理&#xff0c;展示心率和QRS。程序已调通&#xff0c;可…...

SSIM(Structural Similarity),结构相似性及MATLAB实现

参考文献 Wang, Zhou; Bovik, A.C.; Sheikh, H.R.; Simoncelli, E.P. (2004-04-01). “Image quality assessment: from error visibility to structural similarity”. IEEE Transactions on Image Processing. 13 (4): 600–612. Bibcode:2004ITIP…13…600W. CiteSeerX 10.…...

第十六章-消费者-PUSH方式(一)

16.1 准备阶段 先从一段官方示例代码开始 public class Consumer {public static void main(String[] args) throws InterruptedException, MQClientException {// 初始化consumer&#xff0c;并设置consumer group nameDefaultMQPushConsumer consumer new DefaultMQPushCo…...

【C++要哮着学】初识C++,什么是C++?什么是命名空间?什么又是缺省函数?

文章目录 前言1、C简介1.1、什么是C1.2、C起源1.3、C发展 2、C关键字&#xff08;C98&#xff09;3、命名空间3.1、命名空间的定义及使用3.2、命名空间的嵌套3.3、命名空间的三种使用方式3.3.1、加命名空间名称及作用域限定符3.3.2、使用using将命名空间中某个成员引入3.3.3、使…...

Lua 数字格式化

在编程中&#xff0c;对数字进行格式化是一项常见的任务&#xff0c;特别是当我们需要在用户界面中显示数据或生成报告时。在 Lua 中&#xff0c;我们可以使用一些简单而有效的函数来实现数字的格式化。在本文中&#xff0c;我们将介绍一个由几个函数组成的小型 Lua 库&#xf…...

Java入门基础学习笔记13——数据类型

数据类型的分类&#xff1a; 基本数据类型 引用数据类型 基本数据类型&#xff1a;4大类8种类型&#xff1a; 定义整形用int&#xff0c;再大的数用long。 package cn.ensource.variable;public class VariableDemo2 {public static void main(String[] args) {//目标&#x…...

使用Docker+Jar方式部署微服务工程(前后端分离)看着一篇就够了

本篇教程的使用到的技术有springboot、springcloud、Nacos、Docker、Nginx部署前后端分离访问的微服务。 部署一下Nacos 首先我们需要在服务器中&#xff08;或者本地部署启动一下Nacos&#xff09;&#xff0c;这里我采用服务器的方式进行部署&#xff0c;这里有一点不一样的…...

红外遥控和LCD1602

26.1.1 红外线简介 人的眼睛能看到的可见光按波长从长到短排列&#xff0c;依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为 0.62&#xff5e;0.76μm&#xff1b;紫光的波长范围为 0.38&#xff5e;0.46μm。比紫光波长还短的光叫紫外线&#xff0c;比红光波长还长的…...

房屋出租管理系统需求分析及功能介绍

房屋租赁管理系统适用于写字楼、办公楼、厂区、园区、商城、公寓等商办商业不动产的租赁管理及租赁营销&#xff1b;提供资产管理&#xff0c;合同管理&#xff0c;租赁管理&#xff0c; 物业管理&#xff0c;门禁管理等一体化的运营管理平台&#xff0c;提高项目方管理运营效率…...

高精度模拟算法

高精度模拟算法 高精度加法 extern string m,n; extern int a[MAX],b[MAX],ans[MAX]; void addition(){int _mmax(m.size(),n.size());reverse(m.begin(),m.end()),reverse(n.begin(),n.end());//转置原字符串for(int i0;i<m.size();i) a[i]m[i]-0;//字符型以ASCII码存储&…...

Ansible简介版

目录 架构 环境部署 一、Ansible安装部署 1.yum安装Ansible 2.修改主机清单文件 3.配置密钥对验证 4.ansible-doc 5.看被控主机 二、常用模块 1.Command模块 2.Shell模块 3.Cron模块 1.添加 2.删除 4.User模块 5.Group模块 1.创建组 ​编辑 ​编辑 ​编辑…...

卷积通用模型的剪枝、蒸馏---蒸馏篇--RKD关系蒸馏(以deeplabv3+为例)

本文使用RKD实现对deeplabv3+模型的蒸馏;与上一篇KD蒸馏的方法有所不同,RKD是对展平层的特征做蒸馏,蒸馏的loss分为二阶的距离损失Distance-wise Loss和三阶的角度损失Angle-wise Loss。 完整代码放在文末。 一、RKD简介 RKD算法的核心是以教师模型的多个输出为结构单元,取…...

AVL树的完全指南:平衡与性能

文章目录 AVL树简介AVL的操作建立一个AVL树插入操作删除操作 书写代码1.构造函数和析构函数2.获取最大值和最小值3.树的高度和节点个数3.前序中序和后序遍历4.判断树是否为空树5.四个旋转操作6.获取平衡因子7.插入操作8.删除操作9.搜索节点.h文件中的定义 总结 AVL树简介 AVL树…...

itext7 PDF添加水印,获取页面高度,添加到页面右上角

ps: pdf添加水印&#xff0c;内容多的时候会往下跑&#xff0c;修改为获取当前页面高度&#xff0c;进行固定在顶部&#xff0c;其他需要可以自己进行调整&#xff0c;直接贴代码。 public static void main(String[] args) throws IOException {String localFilePath "…...

docker端口映射成功,docker端口不生效的问题解决,外界无法访问docker映射端口

docker端口映射不生效的问题解决 问题 使用docker run -p 88848:8848后&#xff0c;显示容器启动正常&#xff0c;并且使用docker logs –f xxx能够看到容器可以正常启用&#xff0c;docker ps 可以看到容器启动成功&#xff0c;并且端口已经映射,但是在浏览器访问相关地址&am…...

RSA非对称加密解密,前端公钥加密后端私钥解密

RSA非对称加密解密&#xff0c;前端公钥加密后端私钥解密&#xff0c;可以防止陌生人直接通过后端接口篡改数据。有数据泄露的风险。 前端&#xff1a;Vue框架 后端&#xff1a;sprintboot&#xff08;Java&#xff09; 工具类&#xff1a;hutool 前端Vue获取公钥&#xff1a…...

别再只盯着准确率了!手把手教你用Python实现NDCG和MAP,搞定搜索推荐系统评估

别再只盯着准确率了&#xff01;手把手教你用Python实现NDCG和MAP&#xff0c;搞定搜索推荐系统评估 当你在优化推荐算法时&#xff0c;是否曾为选择评估指标而纠结&#xff1f;准确率、召回率这些传统指标虽然直观&#xff0c;却无法捕捉排序质量这一关键维度。本文将带你深入…...

GME-Qwen2-VL-2B助力AIGC内容创作:自动为图片生成创意文案与故事

GME-Qwen2-VL-2B助力AIGC内容创作&#xff1a;自动为图片生成创意文案与故事 你有没有过这样的经历&#xff1f;面对一张精心拍摄的照片&#xff0c;却怎么也憋不出几句像样的文案。或者&#xff0c;看着一张充满故事感的图片&#xff0c;脑海里思绪万千&#xff0c;落到笔尖却…...

阿里图标库(Iconfont)的本地引入 详细步骤

阿里图标库&#xff08;Iconfont&#xff09;本地引入 Vue3 详细步骤&#xff08;文字版&#xff09; 一、准备工作 登录 Iconfont 官网 访问 Iconfont 官网&#xff0c;使用账号登录&#xff08;若无账号需注册&#xff09;。 选择图标并加入项目 在搜索框输入关键词&#x…...

HunyuanVideo-Foley私有部署全攻略:RTX4090D专用优化,轻松搭建AI视频生成环境

HunyuanVideo-Foley私有部署全攻略&#xff1a;RTX4090D专用优化&#xff0c;轻松搭建AI视频生成环境 在AI视频生成领域&#xff0c;最令人沮丧的莫过于看着别人的演示视频效果惊艳&#xff0c;而自己却卡在环境配置和模型部署的泥潭中。从CUDA版本冲突到显存不足崩溃&#xf…...

[具身智能-125]:RQT(Robot Qt),一个可以全方位监控ROS2系统内部节点工作状态的可视化超级终端!!!

如果说 RViz2 是机器人的“眼睛”&#xff08;看 3D 世界&#xff09;&#xff0c;那么 RQT 就是机器人的“听诊器”和“控制台”。它基于 Qt 框架开发&#xff0c;采用插件化架构&#xff0c;让你能在一个窗口里完成对 ROS2 系统内部状态的全方位监控与调试。为了让你更好地利…...

用快马ai五分钟生成java学习路线可视化原型,清晰规划你的编程进阶之路

今天想和大家分享一个特别实用的Java学习路线可视化工具的开发过程。作为一个Java初学者&#xff0c;我经常被各种知识点搞得晕头转向&#xff0c;直到发现用InsCode(快马)平台可以快速搭建一个学习路线图&#xff0c;整个开发过程只用了不到半小时&#xff0c;效果却出奇地好。…...

MobaXterm远程连接频繁掉线?3个SSH保活设置让你告别断连烦恼

MobaXterm远程连接频繁掉线&#xff1f;3个SSH保活设置让你告别断连烦恼 当你在深夜调试代码&#xff0c;或是处理关键服务器运维任务时&#xff0c;突然弹出的"Connection closed"提示足以让人抓狂。MobaXterm作为Windows平台最受欢迎的全能终端工具&#xff0c;其免…...

Mojo+Python混合部署案例深度拆解(从Jupyter到生产环境的无缝迁移全路径)

第一章&#xff1a;MojoPython混合部署案例深度拆解&#xff08;从Jupyter到生产环境的无缝迁移全路径&#xff09;Mojo 作为新兴的系统级编程语言&#xff0c;与 Python 生态天然兼容&#xff0c;为机器学习模型从探索性开发&#xff08;Jupyter Notebook&#xff09;迈向高吞…...

百川2-13B-4bits量化版精度测试:OpenClaw自动化任务准确率对比

百川2-13B-4bits量化版精度测试&#xff1a;OpenClaw自动化任务准确率对比 1. 测试背景与实验设计 上周在部署OpenClaw自动化工作流时&#xff0c;我遇到了一个现实问题&#xff1a;本地显卡只有12GB显存&#xff0c;跑不动原版13B模型。于是尝试了百川2-13B的4bits量化版本&…...

HunyuanVideo-Foley实战案例:为纪录片自动匹配环境音效的完整工作流

HunyuanVideo-Foley实战案例&#xff1a;为纪录片自动匹配环境音效的完整工作流 1. 项目背景与需求 在纪录片制作过程中&#xff0c;环境音效的采集和匹配往往需要耗费大量时间和人力成本。传统方式需要音效师实地录制或从音效库中手动挑选&#xff0c;整个过程耗时且难以保证…...