參考博客:http://python.jobbole.com/81916/python
能夠直接做用於for循環的對象統稱位可迭代對象(iterable).函數
能夠被next()函數調用並不斷返回下一個值的對象成爲迭代器(iterator)。spa
全部的lterable都可以經過內置函數iter()來轉化爲iterator().code
對迭代器來說,有一個_next()就夠了。在使用for和in語句的時候,程序就會自動調用即將被處理的對象的迭代器對象。而後使用它的next()方法,直到監測到一個Stopiteration異常。對象
>>> l = [1,2,3,4] >>> L = iter(l) >>> next(I) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'I' is not defined >>> next(L) 1 >>> next(L) 2 >>> next(L) 3 >>> next(L) 4 >>> next(L) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
上面例子中,列表I能夠被for進行循環,可是不能被內置函數next()用來查找下一個值,因此I是iterable。blog
I經過iter進行包裝後爲L,L能夠被next()用來查找下一個值,因此L是iterable。繼承
for循環內部事實上就是先調用iter()把iterable變成iterator再進行循環迭代。ip
iterator繼承自iterable,iterator包含__iter()和next()方法,而iterable僅僅包含iter__().博客
iterable須要包含有__iter()方法用來返回iterator,而iterator須要包含有next__()方法用來被循環。it
若是咱們本身定義迭代器,只要在類裏面定義一個iter()函數,用它來返回一個帶next()方法的對象就夠了。
class Iterable: def __iter__(self): return Iterator() #轉換成迭代器 class Iterator: def __init__(self): self.start = -1 def __next__(self): self.start +=2 if self.start > 10: raise StopIteration return self.start I = Iterable() for i in I: print(i) 結果: 1 3 5 7 9
上面的代碼實現的是找到10之內的奇數,代碼中的類名能夠隨便取。
若是在Iterator的__next__方法中沒有實現Stoplteration異常,那麼則是表示的所有爲奇數,那麼須要在調用的時候設置退出循環的條件。咱們經過range來實現打印多少個元素,這裏表示打印5個元素,返回的結果和上面一致。
class Iterable: def __iter__(self): return Iterator() class Iterator: def __init__(self): self.start = -1 def __next__(self): self.start +=2 return self.start I = Iterable() for count,i in zip(range(5),I): print(i)
能夠把這兩個合併在一塊兒
class Iterable: def __iter__(self): #直接改變類型,傳遞到原來的參數上面 return self def __init__(self): self.start = -1 def __next__(self): self.start +=2 if self.start > 10: raise StopIteration return self.start I = Iterable() for i in I: print(i)
注意:迭代器不能向後移動,不能回到開始。