首页 > 其他分享 >Iterator与Iterable(迭代器与可迭代)

Iterator与Iterable(迭代器与可迭代)

时间:2024-07-28 23:29:05浏览次数:16  
标签:迭代 Iterator 对象 next class Iterable

一 前言

环境: python 3.10 win10

二 Iterator(迭代器)

Iterator 是python的内置类型之一,看下其定义
image

该类型的实例对象称之为iterator(迭代器对象)
要得到一个iterator(迭代器对象),可用内置函数iter()将 list tuple等转成迭代器对象
也可以自定义一个迭代器类型的class,该class的实例对象就是迭代器对象

迭代器对象需要支持一下两个方法:

  • iterator.iter(): 返回迭代器对象本身()

  • iterator.next():重复调用该方法,将逐个返回迭代器中的数据,如果已经没有可返回的项,则会引发 StopIteration 异常

下面自定义一个迭代器对象的class,该class的迭代器对象通过__next__()或者内置函数next()能不断返回偶数
image

实际使用中,并不需要一直重复调用next(),因为迭代器对象也一定是后面讲的可迭代对象,所以。可直接将迭代器用于for循环中,不断返回其中的数据
image

注意,上图中第一次调用Get_num()方法时,并没有打印出数据
因为这时候使用的迭代器对象it和之前代码中next(it)的it是同一个对象,而之前该迭代器对象已经输出到数字6,这时候再调用Get_num()方法,方法中for循环其实也是不断调用next()方法,所以此时Get_num()中得到的数字是8,而数字8遇到break就不会打印出来

第二次调用Get_num(),我们重新生成了一个迭代器对象作为参数传了进去,和之前的不是一个对象,作为一个全新的迭代器对象,此时就会按照class的定义从0开始输出

用内置函数转换得到的迭代器对象也有上面两个方法
image

判断一个对象是否是否是Iterator类型
image

三 Iterable(可迭代)

Iterable也是一种类型即class ,看下其定义
image

这种类型的对象称为可迭代对象,它是一种能够逐个返回其成员项的对象。 可迭代对象的例子包括所有序列类型(如 list, str 和 tuple 等)以及某些非序列类型如 dict, 文件对象 以及任何定义了 iter() 方法或实现了 sequence 语义的 getitem() 方法的自定义类的对象。

由上面可知,迭代器对象一定是可迭代对象,因为迭代器对象肯定支持__iter__()方法,class的定义也显示Iterator继承自Iterable
反过来,可迭代对象不一定是迭代器

英语单词iterate本就有迭代、重复、反复之意。
可迭代对象可用于for循环,不断得到其中的数据

判断是否是可迭代对象
image

标签:迭代,Iterator,对象,next,class,Iterable
From: https://www.cnblogs.com/MyRecords/p/18328446

相关文章

  • 基因编辑技术之“速”力量:让单倍体育种技术迭代升级
    作物品种改良主要得益于育种过程带来的遗传获得。传统育种技术受制于表型观察准确性和遗传累赘效应等影响,其育种目标随机且费时费力,需要多个世代的自交才能获得性状稳定的品种。因此,生产上迫切需要高效、快速、精准改良作物性状的技术来加速作物的育种进程。单倍体诱导(haploidin......
  • list[str] 是可迭代的吗?
    Python3.10不这么认为:Python3.10.6|packagedbyconda-forge|(main,Aug222022,20:38:29)[Clang13.0.1]\ondarwinType"help","copyright","credits"or"license"formoreinformation.>>>from......
  • Lua 语法之迭代器
    迭代器主要是用来遍历表的两个迭代器区别#ipairspairs索引必须数字且连续索引必须数字且连续索引可以随意从1开始到nil从1开始到nil从1开始到无其他索引字符索引不识别字符索引不识别字符索引识别关键字ipairs--#得到长度其实并不准确一般不......
  • 18 双周迭代模式(3)
            前面几篇了解了敏捷开发的实践以及敏捷迭代管理,Scrum敏捷中,建议是2~4周一个迭代周期,较为广泛应用的是双周迭代模式,即两周完成一个迭代周期,一个迭代周期是指,软件开发到上线的时间。        在研发人员还在开发当前迭代的功能时,产品经理就规划好下一个迭......
  • 迭代字符串列表以检索字符串组
    给定以下列表:inp=["arg1:","list","of","args","arg2:","other","list"]如何开发这样的字典?out={"arg1":["list","of","args"],"arg2":......
  • Python - 检测字母模式而不迭代所有可能的组合
    对于可能不太有用的标题,我表示歉意,我不知道如何将这个问题总结为一句话。我正在尝试计算Python3.10中一个单词有多少个“单位”长。一个“单位”是(C表示辅音,V表示元音)CV或VC或C或V(后两者仅在没有配对时使用)可以制作)。例如,“件”将为三个单位......
  • Python (Pebble) - 超时功能。当 TimeoutError 发生时,获取从 iterable 传递给函数的值
    我正在尝试在Pebble中设置工作超时(基本上有效)frompebbleimportProcessPoolfrommultiprocessingimportProcess,Pool,cpu_countimporttimedeftest_fn(randomNumberFromList):#print(f'Beginngingforthisnumber:{randomNumberFromList}')ifr......
  • 【LuBase低代码框架】首次上线及后期迭代如何从测试环境升级到正式环境?
            LuBase低代码框架采用了基于Json的配置+前端渲染引擎的模式,所以对应用的升级说白了就是对配置信息的升级。以下对LuBase低代码框架中,一个应用包含的配置信息进行讲解,讲解完后,您就会明白如何在不同环境中升级一个应用。    LuBass框架中一个应用包含如......
  • 适用于 Python 的 Firebase-admin sdk 引发错误“StreamGenerator”不可迭代
    以前(一周前)我与Firestore通信的Python代码工作得很好。但今天我又开始研究它,它在迭代collection.stream()service_account=credentials.Certificate('credential/serviceAccount.json')firebase_admin.initialize_app(service_account)firestore_d......
  • 设计模式总结:适配器、桥接、组合和迭代器模式
    在之前的对话中,我们讨论了五种常见的Java设计模式:单例、工厂、策略、装饰器和观察者模式。现在,让我们继续探索其他四种设计模式:适配器、桥接、组合和迭代器模式。适配器模式概念:适配器模式是一种结构型设计模式,用于将一个类的接口转换为另一个类期望的接口。适配器模式......