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