本文經過文章同步功能推送至博客園,顯示排版可能會有所錯誤,請見諒!
迭代器指對象提供了一個next方法,執行該方法要麼放回迭代中的下一項,要麼就引發一個Stopitertion錯誤,以終止迭代。 python
可迭代對象則是內部定義了一個__iter__()方法以實現迭代器協議的對象。 從迭代器定義上來,全部迭代器都應有next方法。可迭代對象並不是迭代器,本質上,可迭代對象(如字符串、列表、元組、集合、字典、文件等)內部提供了一個__iter__()方法,使用__iter__()方法能將其轉化爲一個迭代器,進而支持next方法用於迭代。 函數
在python中,for循環、sum、map和filter等函數實質上是使用迭代器協議。如for循環,接受一個可迭代對象,在實際處理時,先使用可迭代對象的__iter__()方法得到一個迭代器,而後在使用next方法迭代,直到返回最後一個值,for內置了處理Stopitertion錯誤的機制。 spa
for i in list(range(101)): print(i)
上述for循環簡單模擬處理以下: code
Iter = range(101).__iter__() while True: try: i = Iter.__next__() print(i) except Stopitertion: break
迭代器能夠使用3種方式迭代 對象
使用send()方法時,能夠傳入一個值給當前yield。 blog
知道了迭代器的特性,咱們能夠使用迭代器簡單模擬實現一個列表對象的索引功能! 繼承
class LIST(list): '''新建一個LIST類,繼承list類''' def find(self,n): """find方法用於索引取值""" i = 0 iter = self.__iter__() #將可迭代對象列表轉爲迭代器賦值給iter res = next(iter) #使用迭代器的next方法 while i != n: #當計數器i不等於目標索引n時,使用next迭代 res = next(iter) i += 1 return res num_list=LIST(i for i in range(100)) #定義一個LIST類的對象 res = num_list.find(50) #調用LIST類中的find方法,取得索引號50的值 print(res) #res = 50