python 中的 __getitem__, __iter__ 和__next__


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

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

__iter__:返回一個可迭代對象

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

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

  這是個和多態有關的問題,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM