我们前面说过Iterable,所有的集合数据类型(比如list,tuple,dict,set,str等)都是Iterable对象,包括上一篇说到的generator,也是Iterable。他们有一个共同的特点,那就是都可以用for循环进行迭代。你可以使用isinstance()函数判断一个对象是不是Iterable对象:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({},Iterable)
True
而我们这一篇要讲的迭代器(Iterator),不但可以跟Iterable对象一样可以使用for循环迭代,还可以不断调用next()函数返回下一个值。我们上一篇说的generator就是迭代器(Iterator)。而list,tuple,dict,set都不能通过不断调用next()返回下一个值,所以它们不是Iterator。
生成器不仅是Iterable对象,还是Iterator对象。
你可以使用isinstance()来判断一个对象是不是Iterator对象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10), Iterator )
True
>>> isinstance([],Iterator)
False
虽然list,dict,tuple等Iterable对象不是Iterator,但你可以通过iter()函数把它们变成Iterator对象:
>>> isinstance(iter([]),Iterator)
True
Iterator对象是一个惰性序列。惰性序列是指它并没有一下子就把它所有的元素列出来,因此它不知道自己有多少元素,只有当它不断next()的时候,它才会去计算下一个值是多少——所以它比较懒惰。
Iterator的好处是它不用一下子就列出所有的元素,那样会占用内存空间,所以它可以表示无限的概念。一个Iterator对象可以表示所有的自然数,但是用一个list就办不到,因为内存有限。
网友评论