迭代器-迭代对象-dir(a)可以查看该数据类型有多少种方法。range(10)在py3里就是一个迭代器,for循环实际就是迭代器的应用

迭代器

我们已经知道,可以直接作用于for循环的数据烈性有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str,bytes等;

一类是generator,数据结构,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是否是Iterable对象。

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,

直到最后抛出StopIteration错误表示无法继续返回下一个值了。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

dir(a)可以查看该数据类型有多少种方法。a是列表,是可迭代对象,但不是迭代器,因为没有next方法。

可以使用isinstance()判断一个对象是否是Iterator对象

生成器都是Iterator对象即迭代器,但list,dict,str虽然是迭代对象Iterable,但不是迭代器Iterator

但是迭代器不都是生成器

把list,dict,str等Iterable变成Iterator可以使用iter()函数

在py3里,range(10)就是一个迭代器

而在py2里,range(10)直接是一个列表[0,1,2,3,4,5,6,7,8,9]

如果在py2里,想生成一个迭代器,那么需要写xrange(10)

在py2里,f是打开文件的对象,f.xreadlines(),就是生成一个迭代器,就可以用f.next方法,而不是用f.read等方法了。

Python的for循环本质上就是通过不断调用next()函数实现的,如下图:只不过for循环封装了迭代器

原文地址:https://www.cnblogs.com/itfat/p/7447457.html