什么是迭代?迭代是指按需一次获取一个数据。是否可以迭代,可以通过是否可以使用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可迭代的对象与迭代器相关推荐

  1. Python 可迭代的对象、迭代器和生成器

    Python中可迭代对象和迭代器对象的理解 我们在用for ... in ...语句循环时,in后面跟随的对象要求是可迭代对象,即可以直接作用于for循环的对象统称为可迭代对象(Iterable),如 ...

  2. 《流畅的Python》学习笔记(11):可迭代的对象、迭代器和生成器

    迭代是数据处理的基石.扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项.这就是迭代器模式( Iterator pattern).在数据的预处理工作中,我们常常需 ...

  3. 流畅的python 14章可迭代的对象、迭代器 和生成器

    可迭代的对象.迭代器和生成器 迭代是数据处理的基石.扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项.这就是迭代器模式(Iterator pattern). 迭 ...

  4. 流畅的python第十四章可迭代的对象,迭代器和生成器学习记录

    在python中,所有集合都可以迭代,在python语言内部,迭代器用于支持 for循环 构建和扩展集合类型 逐行遍历文本文件 列表推导,字典推导和集合推导 元组拆包 调用函数时,使用*拆包实参 本章 ...

  5. 第14章可迭代的对象,迭代器和生成器

    第14章可迭代的对象,迭代器和生成器 这一章大部分内容跟我之前写的一篇文章有重合 https://blog.csdn.net/qq_36267931/article/details/102954056 ...

  6. 『流畅的Python』第14章:可迭代的对象、迭代器和生成器

  7. python文件对象是可以迭代的_详解python可迭代对象、迭代器和生成器

    可迭代对象 什么是可迭代对象?顾名思义就是可以迭代的一个对象,再通俗点就是可以被for循环遍历的对象,如常用的list.str等数据类型.我们可以使用isinstance来判断这个数据是否是可迭代对象 ...

  8. 详解python可迭代对象、迭代器和生成器

    可迭代对象 什么是可迭代对象?顾名思义就是可以迭代的一个对象,再通俗点就是可以被for循环遍历的对象,如常用的list.str等数据类型.我们可以使用isinstance来判断这个数据是否是可迭代对象 ...

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

    2019-06-16 深入理解可迭代对象.迭代器 什么是迭代器模式? 当扫描内存中放不下的数据集时,要找到惰性获取数据项的方式,即按需一次获取一个数据项,这就是迭代器模式 迭代器构成? python没 ...

最新文章

  1. 百度智能搜索到底有多智能?
  2. Fedora中允许mysql远程访问的几种方式
  3. Windows 中进程的相关操作
  4. 九十五、二叉树的递归和非递归的遍历算法模板
  5. 【ASP.NET MVC 学习笔记】- 06 在MVC中使用Ninject
  6. day3-python学习笔记(二)list(数组)
  7. Ubuntu 16.04卸载火狐浏览器
  8. 台积电预计汽车芯片短缺在下一季度将有明显改善 他们已协调产能支持
  9. Python 文档学习
  10. Piggydb 6.2 发布,个人知识库管理
  11. 如何将 KVM 异构虚拟机启动效率提升 6~10 倍?
  12. vue把数据导出为Excel表格的方法
  13. 根据名称获取对应的拼音码首字母大写
  14. 剑侠世界2不显示服务器,剑侠世界2去哪个服务器好_哪个区人多问题说明_软吧...
  15. 守望先锋地图英文和英雄英文
  16. PHP生成压缩包 (并下载)【解决压缩包下载,提示压缩包损坏】
  17. 中国第二家傲途格精选酒店开业;德意志酒店集团所有旗舰酒店合入全新总品牌 | 美通企业日报...
  18. (算法篇)Java实现删除链表倒数第n个节点
  19. egg框架各个上下文中的this中有些啥?
  20. VLC播放器Demo(录像,截图等功能),Android播放器Demo可二次开发。ffmpeg-Kit (录像,截图,合流播放,合流推送,等一些列视频操作功能),可二次开发。

热门文章

  1. 这个B站up主太硬核了!纯手工打造AI小电视:硬件自己焊接,驱动代码全手写...
  2. 算法科普:神秘的 DES 加密算法
  3. 自然语言处理中N-Gram模型介绍
  4. 无连接的用户数据报协议UDP
  5. 卷积神经网络如何处理一维时间序列数据?
  6. 第十四篇:有概率的上下文无关语法Probabilistic Context-Free Grammar
  7. C#/Net代码精简优化技巧
  8. 不明原因的约束报错的两种处理方式
  9. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)...
  10. rrdtool 修改水印logo