最近在读《流畅的python》,对生成器有了进一步的认识。理解生成器前,要理解可迭代对象(iterable)和迭代器(iterator)。
下面看例子
>>> l = list(range(3))
>>> l
[0, 1, 2]
>>> next(l)
Traceback (most recent call last):
File "", line 1, in
TypeError: list object is not an iterator
>>> li = iter(l)
>>> li
>>> next(li)
0
>>> next(li)
1
>>> next(li)
2
>>> next(li)
Traceback (most recent call last):
File "", line 1, in
StopIteration
>>> next(li)
Traceback (most recent call last):
File "", line 1, in
StopIteration
>>>
首先我们得到一个list对象,对它应用next()函数,报错list不是迭代器。对,list是可迭代对象,可以对它应用iter()函数,得到一个迭代器对象li。
不断的对li应用next()函数,得到每一个元素,然后抛出了StopIteration异常,再应用next()函数还是这个异常。
>>> iter(li)
对li应用iter()得到的还是它自己,注意内存地址都是0x022C3570。
在python语言里,迭代器用于支持:
上面铺垫了这么多,都是为了引出下面这一句,直接摘录书中原话了:
"在python社区中,大多数时候都把迭代器和生成器视作同一概念。"
记住了,生成器就是迭代器。