用戶:Xyy23330121/Python/類的方法與Python的計算/迭代操作支持
迭代器
編輯迭代器是一種特殊的對象。一個迭代器對象應當有兩個方法:
__next__
方法,返回下一個迭代的對象。__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