# 每天學點Python之Iterator
我們經常需要遍歷一個對象中的元素,在Python中這種功能是通過迭代器來實現的。
### 原理
每一個迭代器可以通過反復調用迭代器的__next__()方法來返回創建該迭代器的對象中的后繼值。當沒有可用數據時,產生一個StopInteration異常。此時,迭代器對象被耗盡,之后再調用 __next__()方法只會再次產生StopInteration異常。需要訪問的對象要求包含一個__iter__()方法,用于返回迭代器對象,如果對象就實現了迭代器方法,就可以返回對象本身。
### 使用
我們可以通過調用iter()方法來返回對象的迭代器:
~~~
>>> i = iter("hello")
>>> i.__next__()
'h'
>>> next(i)
'e'
>>> next(i)
'l'
>>> next(i)
'l'
>>> next(i)
'o'
>>> next(i)
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration
~~~
對于Python中常見的一些數據類型,如元組、列表、字典等都已經自己實現了迭代器功能,這使得它們能在for循環中正常工作:
~~~
>>> for i in (2,3,1):
... print(i)
...
2
3
1
~~~
### 自定義
如果我們要求自定義訪問對象中的數據,那該如何做呢,我們需要實現__iter()__和__next()__方法,下面我們給出自己的對象,實現一個簡易的計時器功能:
~~~
class CountDown:
def __init__(self, start):
self.count = start
def __iter__(self):
return self
def __next__(self):
if self.count <= 0:
raise StopIteration
r = self.count
self.count -= 1
return r
if __name__ == "__main__":
for time in CountDown(3):
print(time)
輸出:3 2 1
~~~