1. 程式人生 > >自己寫一個迭代器,然後重寫list類,即MyList類,實現部分和list一樣的特性

自己寫一個迭代器,然後重寫list類,即MyList類,實現部分和list一樣的特性

先直接貼程式碼,並附加了詳細註釋

'''示意可迭代物件的定義'''
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__函式,解釋不準確的地方也請大家指正,互相學習!