python中的迭代器

1、可以直接作用于for循环的数据类型

  第一类:集合数据类型,如listtupledictsetstr等;

  第二类:generator,包括集合定义generator和带yield的generator(也就是generator function)。

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

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

 >>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

2、迭代器(Iterator)

generator不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。那么定义来了,可以被next()调用并不断返回下一个值得对象称为迭代器(Iterator)。

很明显,generator可以被next()调用,并不断返回下一个值,所以generator肯定是Iterator。那么除了generator,还有那些是Iterator呢?如何判断一个对象是否是Iterator呢?

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

 >>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator) #注意,(x for x in range(10))这是一个generator,因为由列表生成式[]改成了()。
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

从以上可以看出,list,dict,str虽然是Iterable,但不是Iterator。  而generator都是Iterator。

3、将Iterable变成Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

 >>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

例如:

 g = iter('abc')

 >>> next(g)
'a'
>>> next(g)
'b'
>>> next(g)
'c'
>>> next(g)
Traceback (most recent call last):
File "<pyshell#202>", line 1, in <module>
next(g)
StopIteration

 4、小结

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

上一篇:《C++ 101条建议》学习笔记——第一章快速入门


下一篇:WEB前端程序员需要的网站整理