迭代器

參考博客: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)

注意:迭代器不能向後移動,不能回到開始。

相關文章
相關標籤/搜索