Python可迭代的对象与迭代器
什么是迭代?迭代是指按需一次获取一个数据。是否可以迭代,可以通过是否可以使用for循环取值来进行简单的判断。更准确的判断是使用iter()函数,这是一个Python内置函数。 |
可迭代的对象
iter()函数的作用如下:
如果对象实现了__iter__方法,那么就调用它,获取一个迭代器。比如:
def __iter__(self): return SentenceIterator(self.words)
如果对象没有实现__iter__但是实现了__getitem__方法,那么就创建一个迭代器,尝试从索引0开始获取元素。
如果尝试获取元素失败,就会抛出TypeError异常。
可迭代的对象,就是使用iter()函数判断,满足前面2点的对象。
任何Python序列都是可以迭代的,因为它们都实现了__getitem__方法。
迭代器
从前面iter()函数的作用可以发现,迭代器是从可迭代的对象中获取的。
如果对象本身是可迭代的,就调用__iter__方法获取一个迭代器。
如果对象不可迭代但是实现了__getitem__方法,那么就会创建一个迭代器。
比如可以使用iter()函数把列表转换为迭代器:
>>> test_list = [1, 2, 3] >>> print(type(test_list)) <class 'list'>>>> test_iter = iter(test_list) >>> print(type(test_iter)) <class 'list_iterator'>
迭代器可以使用for循环遍历:
for x in test_iter: print(x)
也可以使用while循环遍历:
while True: try: print(next(test_iter)) except StopIteration: del test_iter break
- next()函数用于获取迭代器下一个元素。
- 没有元素了,迭代器会抛出StopIteration异常。
标准的迭代器接口有两个方法:
- __next__返回下一个元素。
- __iter__返回self,以便在应该使用可迭代对象的地方使用迭代器,比如for循环中。
def __iter__(self): return self
迭代器的准确定义是:迭代器是这样的对象,它实现了无参数的__next__方法,返回序列中的下一个元素;如果没有元素了,那么抛出StopIteration异常。Python中的迭代器还实现了__iter__方法,因此迭代器也是可以迭代的。
最后,通过对比可以发现,可迭代对象的__iter__返回的是迭代器:
def __iter__(self): return SentenceIterator(self.words)
迭代器的__iter__返回的是self:
class SentenceIterator: def __iter__(self): return self
而且迭代器还需要有__next__方法。
从这一点就能清楚看出它们的区别了。
需要特别注意的是,可迭代的对象一定不能是自身的迭代器,也就是说,可迭代对象必须实现__iter__方法,但是不能实现__next__方法。否则会让设计模式变得混乱不堪。
Python可迭代的对象与迭代器相关推荐
- Python 可迭代的对象、迭代器和生成器
Python中可迭代对象和迭代器对象的理解 我们在用for ... in ...语句循环时,in后面跟随的对象要求是可迭代对象,即可以直接作用于for循环的对象统称为可迭代对象(Iterable),如 ...
- 《流畅的Python》学习笔记(11):可迭代的对象、迭代器和生成器
迭代是数据处理的基石.扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项.这就是迭代器模式( Iterator pattern).在数据的预处理工作中,我们常常需 ...
- 流畅的python 14章可迭代的对象、迭代器 和生成器
可迭代的对象.迭代器和生成器 迭代是数据处理的基石.扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项.这就是迭代器模式(Iterator pattern). 迭 ...
- 流畅的python第十四章可迭代的对象,迭代器和生成器学习记录
在python中,所有集合都可以迭代,在python语言内部,迭代器用于支持 for循环 构建和扩展集合类型 逐行遍历文本文件 列表推导,字典推导和集合推导 元组拆包 调用函数时,使用*拆包实参 本章 ...
- 第14章可迭代的对象,迭代器和生成器
第14章可迭代的对象,迭代器和生成器 这一章大部分内容跟我之前写的一篇文章有重合 https://blog.csdn.net/qq_36267931/article/details/102954056 ...
- 『流畅的Python』第14章:可迭代的对象、迭代器和生成器
- python文件对象是可以迭代的_详解python可迭代对象、迭代器和生成器
可迭代对象 什么是可迭代对象?顾名思义就是可以迭代的一个对象,再通俗点就是可以被for循环遍历的对象,如常用的list.str等数据类型.我们可以使用isinstance来判断这个数据是否是可迭代对象 ...
- 详解python可迭代对象、迭代器和生成器
可迭代对象 什么是可迭代对象?顾名思义就是可以迭代的一个对象,再通俗点就是可以被for循环遍历的对象,如常用的list.str等数据类型.我们可以使用isinstance来判断这个数据是否是可迭代对象 ...
- 如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...
2019-06-16 深入理解可迭代对象.迭代器 什么是迭代器模式? 当扫描内存中放不下的数据集时,要找到惰性获取数据项的方式,即按需一次获取一个数据项,这就是迭代器模式 迭代器构成? python没 ...
最新文章
- 百度智能搜索到底有多智能?
- Fedora中允许mysql远程访问的几种方式
- Windows 中进程的相关操作
- 九十五、二叉树的递归和非递归的遍历算法模板
- 【ASP.NET MVC 学习笔记】- 06 在MVC中使用Ninject
- day3-python学习笔记(二)list(数组)
- Ubuntu 16.04卸载火狐浏览器
- 台积电预计汽车芯片短缺在下一季度将有明显改善 他们已协调产能支持
- Python 文档学习
- Piggydb 6.2 发布,个人知识库管理
- 如何将 KVM 异构虚拟机启动效率提升 6~10 倍?
- vue把数据导出为Excel表格的方法
- 根据名称获取对应的拼音码首字母大写
- 剑侠世界2不显示服务器,剑侠世界2去哪个服务器好_哪个区人多问题说明_软吧...
- 守望先锋地图英文和英雄英文
- PHP生成压缩包 (并下载)【解决压缩包下载,提示压缩包损坏】
- 中国第二家傲途格精选酒店开业;德意志酒店集团所有旗舰酒店合入全新总品牌 | 美通企业日报...
- (算法篇)Java实现删除链表倒数第n个节点
- egg框架各个上下文中的this中有些啥?
- VLC播放器Demo(录像,截图等功能),Android播放器Demo可二次开发。ffmpeg-Kit (录像,截图,合流播放,合流推送,等一些列视频操作功能),可二次开发。
热门文章
- 这个B站up主太硬核了!纯手工打造AI小电视:硬件自己焊接,驱动代码全手写...
- 算法科普:神秘的 DES 加密算法
- 自然语言处理中N-Gram模型介绍
- 无连接的用户数据报协议UDP
- 卷积神经网络如何处理一维时间序列数据?
- 第十四篇:有概率的上下文无关语法Probabilistic Context-Free Grammar
- C#/Net代码精简优化技巧
- 不明原因的约束报错的两种处理方式
- spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)...
- rrdtool 修改水印logo