Logo
Section 1 / 7

迭代器

本课程将介绍 Python 中的内置迭代器,并教你如何创建自己的自定义迭代器类。

导入

迭代器

本课程将介绍 Python 中的内置迭代器,并教你如何创建自己的自定义迭代器类。

迭代器

正如我们之前所见,在 Python 中,我们使用 for 循环和 while 循环来遍历对象的内容:

1for value in [0, 1, 2, 3, 4, 5]: 2 print(value)

能够与 for 循环一起使用的对象被称为可迭代对象(iterable)。而迭代器则是遵循迭代协议的对象。

内置的 iter 方法可用于创建迭代器对象,而 next 方法可用于逐步遍历其内容:

1my_iter = iter([1, 2, 3]) 2print(next(my_iter)) 3print(next(my_iter)) 4print(next(my_iter))

当没有更多元素时,迭代器会引发 StopIteration 异常。

1my_iter = iter([1, 2, 3]) 2next(my_iter) 3next(my_iter) 4next(my_iter)

迭代器类

迭代器可以实现为类;你只需要实现 __next__ 和 __iter__ 方法。下面是一个模仿 range 函数的类示例,它返回从 a 到 b 的所有值:

1class MyRange: 2 def __init__(self, a, b): 3 self.a = a 4 self.b = b 5 6 def __iter__(self): # 返回迭代器对象本身 7 return self 8 9 def __next__(self): # 返回序列中的下一个元素 10 if self.a < self.b: 11 value = self.a 12 self.a += 1 13 return value 14 else: 15 raise StopIteration

基本上,每次调用 next 时,它都会将内部变量 a 前进一位,并返回其值。当达到 b 时,它会抛出 StopIteration 异常。你可以通过取消注释最后一行来观察这一行为。

1class MyRange: 2 def __init__(self, a, b): 3 self.a = a 4 self.b = b 5 6 def __iter__(self): # 返回迭代器对象本身 7 return self 8 9 def __next__(self): # 返回序列中的下一个元素 10 if self.a < self.b: 11 value = self.a 12 self.a += 1 13 return value 14 else: 15 raise StopIteration 16 17myrange = MyRange(1, 4) 18print(myrange.__next__()) 19print(myrange.__next__()) 20print(myrange.__next__()) 21# print(myrange.__next__())

但更重要的是,你可以将迭代器类用于 for 循环:

1class MyRange: 2 def __init__(self, a, b): 3 self.a = a 4 self.b = b 5 6 def __iter__(self): # 返回迭代器对象本身 7 return self 8 9 def __next__(self): # 返回序列中的下一个元素 10 if self.a < self.b: 11 value = self.a 12 self.a += 1 13 return value 14 else: 15 raise StopIteration 16 17for value in MyRange(1, 4): 18 print(value)

现在你已经掌握了基础知识,让我们来解决一些关于迭代器的挑战题。

类

挑战 1:返回从 1 到 n 的偶数