python中的迭代器

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

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

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

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

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

 1 >>> from collections import Iterable
 2 >>> isinstance([], Iterable)
 3 True
 4 >>> isinstance({}, Iterable)
 5 True
 6 >>> isinstance('abc', Iterable)
 7 True
 8 >>> isinstance((x for x in range(10)), Iterable)
 9 True
10 >>> isinstance(100, Iterable)
11 False

2、迭代器(Iterator)

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

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

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

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

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

3、将Iterable变成Iterator

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

1 >>> isinstance(iter([]), Iterator)
2 True
3 >>> isinstance(iter('abc'), Iterator)
4 True

 例如:

 1 g = iter('abc')
 2 
 3 >>> next(g)
 4 'a'
 5 >>> next(g)
 6 'b'
 7 >>> next(g)
 8 'c'
 9 >>> next(g)
10 Traceback (most recent call last):
11   File "<pyshell#202>", line 1, in <module>
12     next(g)
13 StopIteration

 4、小结

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

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

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

posted @ 2016-11-26 21:44  Bio-Liu  阅读(2160)  评论(0编辑  收藏  举报