可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
可以这么认为:
可以被next()
函数调用并不断返回下一个值的Iterable称为迭代器:Iterator
。
Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算,所以不能提前知道Iterator序列的长度和数据。
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数,list、dict、str等Iterable使用iter()后 不是生成器,因为不是推算出来的:
代码参考:
from collections.abc import Iterator
from collections.abc import Generator
c = iter('bcd') #字符串是可迭代的,转换成迭代器
print(c.__next__())
print(c.__next__())
print(next(c)) #其实调用的就是__next__()这个方法,for循环本质上也是通过不断调用next()函数实现
print(isinstance(c,Iterator)) #返回 True 是一个迭代器
print(isinstance(c,Generator)) #返回 False 不是一个生成器
生成器 与迭代器 区别:
生成器是一种特殊的迭代器,迭代器包含生成器,是迭代器不一定是生成器;
参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178254193589df9c612d2449618ea460e7a672a366000
https://www.cnblogs.com/alex3714/articles/5765046.html