for循环执行时获得一个Iterable对象,调用Iterable对象的__iter__方法返回一个Iterator,以后一直调用Iterator的__next__方法返回对象,直到产生StopIteration异常。这个逻辑有一个问题,就是为何咱们不跳过让Iterable对象返回Iterator这一步,而硬性要求for循环接受一个Iterator?并发
这是由于许多对象好比list、dict,是能够重复遍历的,甚至能够同时并发地进行遍历,经过__iter__每次返回一个独立的迭代器,就能够保证不一样的迭代过程不会互相影响。而生成器表达式之类的结果每每是一次性的,不能够重复遍历,因此直接返回一个Iterator就好。让Iterator也实现Iterable的兼容就能够很灵活地选择返回哪种。对象