2019-06-16 深入理解可迭代对象、迭代器

什么是迭代器模式?

当扫描内存中放不下的数据集时,要找到惰性获取数据项的方式,即按需一次获取一个数据项,这就是迭代器模式

迭代器构成?

python没有宏,yield构建生成器(generator)

生成器和迭代器有什么不同?

相同点:

所有生成器都是迭代器,因为生成器完全实现了迭代器接口

不同点:

迭代器用于从集合中取出元素

生成器用于凭空生成元素

生成器的用途?

内置range() 返回的是一个类似生成器的对象,以前返回的是列表

range()返回列表—> list(range())

解决问题: Sentence类,通过索引从文本中提取单词

import reprlib # reprlib.repr() 用于生成大型数据结构的简略字符串表示形式
import re
import reprlib RE_WORD = re.compile('w+')class Sentence:def __init__(self, text):self.text = text self.words = RE_WORD.findall(text)def __getitem__(self, index):return self.words[index]def __len__(self):return len(self.words)def __repr__(self):return 'Sentence(%s) ' % reprlib.repr(self.text)

为什么序列可以迭代?

iter函数

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

内置的iter函数有什么作用?

  1. 检查对象是否实现了__iter__方法,如果实现了就调用它,获取一个迭代器
  2. 如果没有实现__iter__方法,但实现了__getitem__方法,python会创建一个迭代器,尝试按顺序(从0开始)获取元素
  3. 如果尝试失败,python抛出TypeError异常。("C is not iterable", C是目标对象所属的类)

为什么任何python序列都可迭代?

  1. 都实现了__getitem__方法
  2. 标准序列也都实现了__iter__方法

鸭子类型(duck typing)的极端形式是什么?

不仅要实现__iter__方法,还需要实现__getitem__方法,而且__getitem__方法的参数是从0开始的整数,这样才认为该对象是可迭代的。

白鹅类型(goose-typing)定义的可迭代对象是什么?

如果实现了__iter__方法就认为对象是可迭代的,此时不需要创建,不需要注册,因为是abc.Iterable类实现了__subclasshook__方法

判断对象是否可迭代的方法?

  1. 最准确的方法:调用iter(x)函数,如果不可迭代,抛出TypeError异常(iter兼容遗留的__getitem__方法)
  2. 使用abc.Iterable进行判断(不兼容__getitem__方法)

python class Foo: def __iter__(self): pass from collections import abc issubclass(Foo, abc.Iterable) True f = Foo() isinstance(f, abc.Iterable)

什么是可迭代对象?

使用iter内置函数可以获取迭代器的对象

迭代的几种情况?

  1. 如果对象实现了能返回迭代器的__iter__方法,那么对象是可迭代的
  2. 序列都可以迭代
  3. 实现了__getitem__方法,而且其参数是从0开始的索引,这种对象也可迭代

可迭代对象和迭代器的关系是什么?

pyton从可迭代的对象中获取迭代器

s = '123'
it = iter(s) # 使用可迭代的对象构建迭代器itwhile True:try:print(next(it)) # 调用next函数,获取下一个字符except StopIterator: # 没有字符了会抛出StopIteration异常del it  # 释放对it的引用,即废弃迭代器对象break  # 退出循环

标准的迭代器需要实现哪两个方法?

__next__

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

__iter__

返回self,以便在应该使用可迭代对象的地方使用迭代器

这个接口在collections.abc.Iterator抽象基类中制定,这个类定义了__next__抽象方法,而且继承自Iterable类,__iter__抽象方法则在Iterable中定义

Iterable和Iterator抽象基类

具体的Iterable.__iter__方法应该返回一个Iterator实例

具体的Iterator类必须实现__next__方法,Iterator.__iter__方法直接返回实例本身(return self),这样在需要可迭代对象的地方就可以使用迭代器

迭代器的使用注意事项有哪些?

迭代器只需__next____iter__两个方法,所以除了调用next()方法,以及补货StopIterator异常之外,没有办法检查是否还有遗留的元素。(注:没有办法还原迭代器)

如果还想再次迭代同一对象该如何操作?

想再次迭代,就要调用iter(),传入之前构建迭代器的可迭代对象。传入迭代器本省没用,因为前面说过Iterator.__iter__方法的实现方式是返回实例本身,所以传入迭代器无法还原已经耗尽的迭代器

迭代器到底是什么?

迭代器是这样的对象:实现了无参数的__next__方法,返回序列中的下一个元素;如果无元素了,则抛出StopIteration异常。python中的迭代器还实现了__iter__方法,因此迭代器也是可迭代的。

如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...相关推荐

  1. 完全理解python迭代对象_完全理解Python迭代对象、迭代器、生成器

    1.assert:python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触 ...

  2. java定义一个类计算圆的半径,C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计...

    导航:网站首页 > C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计 C++编程:定义一个圆类要求属性为半径, ...

  3. Java创建一个文件变量_java如何定义一个类,创建它的成员变量和方法?

    展开全部 类即对象的思想,一个对象包含e68a843231313335323631343130323136353331333337623439了属于自己的成员变量和操作方法. 如何定义一个类,得看你对 ...

  4. java定义一个类_java如何定义一个类,创建它的成员变量和方法?

    展开全部 类即对象的思想,一个对象包含e69da5e887aa3231313335323631343130323136353331333337623439了属于自己的成员变量和操作方法. 如何定义一个 ...

  5. python中定义类的关键字_在Python中,定义一个类使用什么关键字?

    [多选题]技术应用的限制包括 [多选题]关于类和对象,下面说法正确的有? [判断题]温度越高,料液的粘度越小,扩散系数越大,可提高膜通量. [单选题]某企业有10台运货车,已知每台车每运行100小时平 ...

  6. 按要求编写一个Java应用程序:(1)定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。(2)编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性

    (1)定义一个类,描述一个矩形,包含有长.宽两种属性,和计算面积方法. public class Jvcs {private int Long; //长private int wide; //宽pub ...

  7. java设计一个bank类实现银行_java定义一个类实现银行账户的概念。

    2016-11-17 13:40黄瞩信 客户经理 比如,只定义了一个抽象方法run(),而要通过系统用极短的时间.这5s内,此后这个线程就不能进入其它状态,进入消亡状态;+i++). 2,另一方面;, ...

  8. 根据公式计算y的值。其中∑表示求各项的和,∏表示求各项的积。定义一个类F,实现上述功能。具体要求如下:

    根据公式计算y的值.其中∑表示求各项的和,∏表示求各项的积.定义一个类F,实现上述功能.具体要求如下: (1)私有数据成员 double x[5]:存放xi(i=1,2,3,4,5)的值,xi不能为0 ...

  9. java设计一个bank类实现银行_用java定义一个类实现银行帐户的概念

    满意答案 ZHIu6Az0v 推荐于 2017.11.26 采纳率:56%    等级:11 已帮助:8247人 /* * 2. 定义一个类实现银行帐户的概念,包括的变量有"帐号" ...

最新文章

  1. python print进度条效果
  2. 设计模式(七):桥接模式
  3. StratifiedKFold()与KFold()比较
  4. sap中用函数增加断点(break point)
  5. 2021第一场 | 阿里云高校计划训练营全面升级!0成本体验云计算入门到进阶
  6. *【CodeForces - 195B】After Training (多解,模拟)
  7. jstl 获取 javascript 定义的变量_前端开发大牛完整总结出了JavaScript 难点 +最新web前端开发教程...
  8. [转]CPoint+CSize+CRect学习大纲
  9. Sublime的Package Control安装方法
  10. Linux内核中增加一个新的驱动模块
  11. STM32 F103 时钟树详解
  12. 学生管理系统(VB)——连接数据库
  13. 中考计算机wps题怎么做,WPS与ScienceWord联合制作理科试卷 -电脑资料
  14. AI人工智能基础之高等数学必知必会-张勇-专题视频课程
  15. PHOTOSHOP绘制卡通人物简单教程
  16. linux查看串口信息tty*
  17. 利用pandas读取Excel文件数据
  18. spotify电脑下载歌曲_26步,把Spotify音乐集成进SAP
  19. WAP协议研究笔记—WAP传输协议
  20. 朴素贝叶斯的垃圾邮件分类

热门文章

  1. 解决 Angular 官网下载的库 Schematics 在 windows 环境不支持 .. 的临时解决方案
  2. 一个好用的Visual Studio Code扩展 - Live Server,适用于前端小工具开发
  3. 关于windows的version和OS build version
  4. Java Spring初学者之调试器里括号包含的类含义
  5. SAP C4C - Field creation not permitted in partner devel
  6. SAP Fiori Elements edit按钮的ABAP端实现细节
  7. Spark练习 - 提交作业到集群 - submit job via cluster
  8. SAP ABAP, Fiori, Android和Hybris里的异步操作
  9. SAP Fiori 应用无法根据contact搜索的原因分析
  10. 一个SAP Marketing Cloud和Kyma的集成