可以直接作用于for循环的对象统称为可迭代对象:Iterable
可使用isinstance()方法来判断一个对象是否为可迭代对象。
两类可迭代对象:
1、集合型数据(list、tuple、dict、set、str等)
2、generator(包括生成器和带yield的generator function)
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象。
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator(后者不能用next()方法调用)。
从性质上看,是因为Iterator对象表示一个数据流,可被next()调用并不断返回下一个数据,直到无数据是抛出错误。只在需要返回下一个数据时才会计算,所以才不会像列表生成式那样占用内存,甚至Iterator可以表示一个无限大的数据流,例如全体自然数,而这对于list来说是永远不可能的。