User: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