Python可迭代的物件與迭代器

roc_guo發表於2021-12-14

Python可迭代的物件與迭代器Python可迭代的物件與迭代器

可迭代的物件

iter()函式的作用如下:

如果物件實現了__iter__方法,那麼就呼叫它,獲取一個迭代器。比如:

def __iter__(self): 
 
return SentenceIterator(self.words)

如果物件沒有實現__iter__但是實現了__getitem__方法,那麼就建立一個迭代器,嘗試從索引0開始獲取元素。

如果嘗試獲取元素失敗,就會丟擲TypeError異常。

可迭代的物件,就是使用iter()函式判斷,滿足前面2點的物件。

任何Python序列都是可以迭代的,因為它們都實現了__getitem__方法。

迭代器

從前面iter()函式的作用可以發現,迭代器是從可迭代的物件中獲取的。

如果物件本身是可迭代的,就呼叫__iter__方法獲取一個迭代器。

如果物件不可迭代但是實現了__getitem__方法,那麼就會建立一個迭代器。

比如可以使用iter()函式把列表轉換為迭代器:

>>> test_list = [1, 2, 3] 
>>> print(type(test_list)) 
<class 'list'>
 
>>> test_iter = iter(test_list) 
>>> print(type(test_iter)) 
<class 'list_iterator'>

迭代器可以使用for迴圈遍歷:

for x in test_iter: 
 
print(x)

也可以使用while迴圈遍歷:

while True: 
 
try: 
 
print(next(test_iter)) 
 
except StopIteration: 
 
del test_iter 
 
break
  • next()函式用於獲取迭代器下一個元素。
  • 沒有元素了,迭代器會丟擲StopIteration異常。

標準的迭代器介面有兩個方法:

  • __next__返回下一個元素。
  • __iter__返回self,以便在應該使用可迭代物件的地方使用迭代器,比如for迴圈中。
def __iter__(self): 
 
return self

迭代器的準確定義是:迭代器是這樣的物件,它實現了無引數的__next__方法,返回序列中的下一個元素;如果沒有元素了,那麼丟擲StopIteration異常。Python中的迭代器還實現了__iter__方法,因此迭代器也是可以迭代的。

最後,通過對比可以發現,可迭代物件的__iter__返回的是迭代器:

def __iter__(self): 
 
return SentenceIterator(self.words)

迭代器的__iter__返回的是self:

class SentenceIterator: 
 
def __iter__(self): 
 
return self

而且迭代器還需要有__next__方法。

從這一點就能清楚看出它們的區別了。

需要特別注意的是,可迭代的物件一定不能是自身的迭代器,也就是說,可迭代物件必須實現__iter__方法,但是不能實現__next__方法。否則會讓設計模式變得混亂不堪。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2847561/,如需轉載,請註明出處,否則將追究法律責任。

相關文章