可迭代对象、迭代器、生成器

 

可以直接作用于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

 

 

 

 

posted @ 2018-07-20 10:57  只记今朝笑  阅读(152)  评论(0编辑  收藏  举报