自己寫一個迭代器,然後重寫list類,即MyList類,實現部分和list一樣的特性
阿新 • • 發佈:2019-01-04
先直接貼程式碼,並附加了詳細註釋
'''示意可迭代物件的定義''' class MyList: '''將此類改為可迭代物件''' def __init__(self, iterable): self.data = [x for x in iterable] return None # __init__不返回或者只能返回None def __repr__(self): # 返回輸出的表示式字串 return "Mylist( % s)" % self.data def __len__(self): '''此方法是len()函式呼叫,此方法返回的必須是整數 bool(self)找不到__bool__時,將呼叫這個函式,若返回0為家,大於0 為真 ''' # 文件字串換行需要三引號喲 count = 0 for x in self.data: if x: count += 1 return count def __iter__(self): '''有此方法的物件可以稱之為可迭代物件 此方法必須返回迭代器,即需要自己做迭代器 ''' return MyListIterator(self.data) # 建立迭代器 class MyListIterator: '''此類的物件是用於訪問MyList物件的迭代器 此類要作為迭代器則必須有__next__(self)方法來實現迭代器協議 ''' # 換行需要用三引號 def __init__(self, data): self.data = data # 繫結可迭代物件的資料 self.index = 0 # 代表self.data的索引 def __next__(self): # 這個裡面就是實現了迭代器協議 '''有次方法的類可以稱之為迭代器''' if self.index >= len(self.data): raise StopIteration # 這裡我們丟擲StopIteration,就不再提供資料,這個異常是給for語句的和while語句 r = self.data[self.index] # 另外的,如果self.index等於len(self.data)時,若前面使用if self.index >= len(self.data), # 編譯器將報錯,異常結果為IndexError: list index out of range self.index += 1 return r # for x in MyList("ABC"): # 其中for語句內建了處理StopIteration異常的機制 # print(x) # 為定義迭代器的時候,會報錯。TypeError: 'MyList' object is not iterable # 以上語句等同於 myl = MyList("123") it = iter(myl) # TypeError: 'MyList' object is not iterable,沒有定義__iter__會報錯 while True: try: x = next(it) # x = it.__next__() print(x) # except StopIteration: break
以上程式碼就是實現一個迭代器,並重寫一個類似於list型別的MyList類,程式碼中最核心的內容就是如何定義__iter__函式和__next__函式,解釋不準確的地方也請大家指正,互相學習!