可迭代对象指的是兼容__iter__函数的对象,调动该函数会返回一个生成器,生成器指的是兼容__next__函数的对象,__next__函数会单次获取便利对象的值并返回。
对于迭代工具,实际上遍历的是迭代器,因此,对于迭代工具(比如for循环),其实际上需要先获取一个迭代器,所以对于可迭代对象,python会先通过iter内置函数作用在可迭代对象上,获取一个迭代器,然后再进行单次遍历(对于已经是生成器的对象,iter函数返回的就是该对象本身),这就是迭代协议。
为什么需要区分可迭代对象和迭代器,因为迭代器只能进行顺序单次遍历,遍历完后无法再获取对象的值,但是我们对于序列对象,并不仅仅对其单次遍历,需要反复的获取对象的值,而可迭代对象就可以反复获取对象的值,这就是区分可迭代对象和迭代器的意义。
生成器对象本身含有__next__函数,因此,生成器对象本身也是迭代器。其通过__next__函数实现值的惰性生成和状态挂起。