python 中的 __getitem__, __iter__ 和__next__

首先先簡單介紹一下這幾個內建函數:函數

__getitem__:根據傳入的int參數,返回一個列表中的元素對象

__iter__:返回一個可迭代對象接口

__next__:當被迭代時,返回下一個迭代的對象get

查了點資料,來源:知乎 連接:https://www.zhihu.com/question/44015086/answer/119281039 做者:靈劍it

  這是個和多態有關的問題,Python中關於迭代有兩個概念,第一個是Iterable,第二個是Iterator,協議規定Iterable的__iter__方法會返回一個Iterator, Iterator的__next__方法(Python 2裏是next)會返回下一個迭代對象,若是迭代結束則拋出StopIteration異常。
同時,Iterator本身也是一種Iterable,因此也須要實現Iterable的接口,也就是__iter__,這樣在for當中二者均可以使用。
個人理解是,若是這個對象被for時,會首先調用__iter__方法返回一個iterator,而後再對這個iterator循環調用__next__方法,直到碰到StopIteration時則中止退出
 
若是for的對象沒有__iter__方法,則沒法得到一個迭代器,那麼就會報錯,可是,若是這個類實現了__getitem__方法,會從0開始依次讀取相應的下標,直到發生IndexError爲止,str類就沒有實現了_iter_方法,因此咱們能夠for一個str對象,讓它的每個字母都打印輸出,接下來附一個經典的FIB類增長理解:
 
class Fib(object):
def __init__(self):
self.a = 0
self.b = 1

def next(self):
self.a , self.b = self.b , self.a + self.b
if self.b > 1000:
  raise StopIteration return self.a def __iter__(self): return self
相關文章
相關標籤/搜索