用戶:Xyy23330121/Python/類的方法與Python的計算/迭代操作支持

來自維基學院


迭代器[編輯 | 編輯原始碼]

迭代器是一種特殊的對象。一個迭代器對象應當有兩個方法:

  1. __next__ 方法,返回下一個迭代的對象。
  2. __iter__ 方法,用於返回自己本身。

iterator.__next__(self)[編輯 | 編輯原始碼]

此方法應返回下一個迭代的對象。如果沒有後續對象,則應當引發 StopIteration 異常。

如果已經引發了 StopIteration 異常,再次調用 __next__ 方法時,應當再次引發 StopIteration 異常。否則,一些基於此特性的運算可能會出錯。

迭代器的簡單示例[編輯 | 編輯原始碼]

為了實現 __next__ 方法,迭代器一般需要保存自己當前迭代的鍵。我們可以為列表設置一個簡單的迭代器:

class MyIter:
    def __init__(self, obj: list):
        self.__obj = obj
        self.__index = -1
    def __iter__(self):
        return self
    def __next__(self):
        self.__index += 1
        try:
            return self.__obj[self.__index]
        except IndexError:
            raise StopIteration

上面的迭代器和 Python 官方給的迭代器是一致的。

調用迭代器[編輯 | 編輯原始碼]

在使用 for elem in obj 等方式的時候,就會自動調用 obj__iter__ 方法。要讓 obj 調用自定義的迭代器,就要在 obj__iter__ 方法中返回自定義的迭代器實例。我們看以下示例:

class MyIter:
    def __init__(self, obj: list):
        self.__obj = obj
        self.__index = -1
    def __iter__(self):
        return self
    def __next__(self):
        self.__index += 1
        try:
            #为了确实说明调用了迭代器,这里修改输出。
            return "MyIter:"+str(self.__obj[self.__index])
        except IndexError:
            raise StopIteration

class MyObj:
	def __init__(self):
		self.list = [0, 1, 2]
	def __iter__(self):
		return MyIter(self.list)

for i in MyObj():
	print(i)

輸出為:

MyIter:0
MyIter:1
MyIter:2