迭代器Iterator
上一节所讲的生成器全部都是迭代器,但是迭代器不一定是生成器,要成为生成器,必须满足两个条件:
- 有iter方法
- 有next方法
迭代器是访问集合元素的一种方式。迭代器对象从集合元素的第一个对象开始访问,直到所有的对向都被访问,过程中迭代器只会往下一个元素访问,而不能向上一个元素访问。
延迟计算或惰性求值 (Lazy evaluation)
由上一节介绍生成器的特点,以及生成器都是迭代器我们知道迭代器所存在一些特性。迭代器在迭代到某个元素的时候才会计算该元素的值,而在访问之前或者之后这个值可以不存在或者被销毁。这个特点使它特别适合遍历一些巨大的甚至是无限的集合,减少内存的占用。
可迭代对象
凡是可作用于for循环的对象都是Iterable(可迭代)类型;
凡是可作用于next()函数的对象都是Iterator(迭代器)类型,它们表示一个惰性求值的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
for循环可用于任何可迭代对象,for循环开始时,会通过迭代协议传输给iter()内置函数,从而能够从迭代对象中获得一个迭代器,返回的对象含有需要的next()方法
程序示例1
判断是否为可迭代对象:
from collections import Iterable
a=isinstance([],Iterable)
b=isinstance({},Iterable)
c=isinstance('',Iterable)
d=isinstance((),Iterable)
print(a,b,c,d)
运行结果:
True True True True
程序示例2
判断是否为迭代器:
from collections import Iterator
a=isinstance([],Iterator)
b=isinstance({},Iterator)
c=isinstance('',Iterator)
d=isinstance((),Iterator)
e=isinstance((x for x in range(10)),Iterator)
print(a,b,c,d,e)
运行结果:
False False False False True
只要是Iterator的一定是Iterable的,反之则不成立。