如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...
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函数有什么作用?
- 检查对象是否实现了
__iter__
方法,如果实现了就调用它,获取一个迭代器 - 如果没有实现
__iter__
方法,但实现了__getitem__
方法,python会创建一个迭代器,尝试按顺序(从0开始)获取元素 - 如果尝试失败,python抛出TypeError异常。("C is not iterable", C是目标对象所属的类)
为什么任何python序列都可迭代?
- 都实现了
__getitem__
方法 - 标准序列也都实现了
__iter__
方法
鸭子类型(duck typing)的极端形式是什么?
不仅要实现__iter__
方法,还需要实现__getitem__
方法,而且__getitem__
方法的参数是从0开始的整数,这样才认为该对象是可迭代的。
白鹅类型(goose-typing)定义的可迭代对象是什么?
如果实现了__iter__
方法就认为对象是可迭代的,此时不需要创建,不需要注册,因为是abc.Iterable类实现了__subclasshook__
方法
判断对象是否可迭代的方法?
- 最准确的方法:调用iter(x)函数,如果不可迭代,抛出TypeError异常(iter兼容遗留的
__getitem__
方法) - 使用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内置函数可以获取迭代器的对象
迭代的几种情况?
- 如果对象实现了能返回迭代器的
__iter__
方法,那么对象是可迭代的 - 序列都可以迭代
- 实现了
__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个为什么)...相关推荐
- 完全理解python迭代对象_完全理解Python迭代对象、迭代器、生成器
1.assert:python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触 ...
- java定义一个类计算圆的半径,C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计...
导航:网站首页 > C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计 C++编程:定义一个圆类要求属性为半径, ...
- Java创建一个文件变量_java如何定义一个类,创建它的成员变量和方法?
展开全部 类即对象的思想,一个对象包含e68a843231313335323631343130323136353331333337623439了属于自己的成员变量和操作方法. 如何定义一个类,得看你对 ...
- java定义一个类_java如何定义一个类,创建它的成员变量和方法?
展开全部 类即对象的思想,一个对象包含e69da5e887aa3231313335323631343130323136353331333337623439了属于自己的成员变量和操作方法. 如何定义一个 ...
- python中定义类的关键字_在Python中,定义一个类使用什么关键字?
[多选题]技术应用的限制包括 [多选题]关于类和对象,下面说法正确的有? [判断题]温度越高,料液的粘度越小,扩散系数越大,可提高膜通量. [单选题]某企业有10台运货车,已知每台车每运行100小时平 ...
- 按要求编写一个Java应用程序:(1)定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。(2)编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性
(1)定义一个类,描述一个矩形,包含有长.宽两种属性,和计算面积方法. public class Jvcs {private int Long; //长private int wide; //宽pub ...
- java设计一个bank类实现银行_java定义一个类实现银行账户的概念。
2016-11-17 13:40黄瞩信 客户经理 比如,只定义了一个抽象方法run(),而要通过系统用极短的时间.这5s内,此后这个线程就不能进入其它状态,进入消亡状态;+i++). 2,另一方面;, ...
- 根据公式计算y的值。其中∑表示求各项的和,∏表示求各项的积。定义一个类F,实现上述功能。具体要求如下:
根据公式计算y的值.其中∑表示求各项的和,∏表示求各项的积.定义一个类F,实现上述功能.具体要求如下: (1)私有数据成员 double x[5]:存放xi(i=1,2,3,4,5)的值,xi不能为0 ...
- java设计一个bank类实现银行_用java定义一个类实现银行帐户的概念
满意答案 ZHIu6Az0v 推荐于 2017.11.26 采纳率:56% 等级:11 已帮助:8247人 /* * 2. 定义一个类实现银行帐户的概念,包括的变量有"帐号" ...
最新文章
- python print进度条效果
- 设计模式(七):桥接模式
- StratifiedKFold()与KFold()比较
- sap中用函数增加断点(break point)
- 2021第一场 | 阿里云高校计划训练营全面升级!0成本体验云计算入门到进阶
- *【CodeForces - 195B】After Training (多解,模拟)
- jstl 获取 javascript 定义的变量_前端开发大牛完整总结出了JavaScript 难点 +最新web前端开发教程...
- [转]CPoint+CSize+CRect学习大纲
- Sublime的Package Control安装方法
- Linux内核中增加一个新的驱动模块
- STM32 F103 时钟树详解
- 学生管理系统(VB)——连接数据库
- 中考计算机wps题怎么做,WPS与ScienceWord联合制作理科试卷 -电脑资料
- AI人工智能基础之高等数学必知必会-张勇-专题视频课程
- PHOTOSHOP绘制卡通人物简单教程
- linux查看串口信息tty*
- 利用pandas读取Excel文件数据
- spotify电脑下载歌曲_26步,把Spotify音乐集成进SAP
- WAP协议研究笔记—WAP传输协议
- 朴素贝叶斯的垃圾邮件分类
热门文章
- 解决 Angular 官网下载的库 Schematics 在 windows 环境不支持 .. 的临时解决方案
- 一个好用的Visual Studio Code扩展 - Live Server,适用于前端小工具开发
- 关于windows的version和OS build version
- Java Spring初学者之调试器里括号包含的类含义
- SAP C4C - Field creation not permitted in partner devel
- SAP Fiori Elements edit按钮的ABAP端实现细节
- Spark练习 - 提交作业到集群 - submit job via cluster
- SAP ABAP, Fiori, Android和Hybris里的异步操作
- SAP Fiori 应用无法根据contact搜索的原因分析
- 一个SAP Marketing Cloud和Kyma的集成