for循環執行時獲得一個Iterable對象,調用Iterable對象的__iter__方法返回一個Iterator,以後一直調用Iterator的__next__方法返回對象,直到產生StopIteration異常。這個邏輯有一個問題,就是爲何咱們不跳過讓Iterable對象返回Iterator這一步,而硬性要求for循環接受一個Iterator?併發
這是由於許多對象好比list、dict,是能夠重複遍歷的,甚至能夠同時併發地進行遍歷,經過__iter__每次返回一個獨立的迭代器,就能夠保證不一樣的迭代過程不會互相影響。而生成器表達式之類的結果每每是一次性的,不能夠重複遍歷,因此直接返回一個Iterator就好。讓Iterator也實現Iterable的兼容就能夠很靈活地選擇返回哪種。對象