迭代器

正如我们之前学到的,在Python中我们可以使用“for”循环来迭代出对象中的内容:

>>> for value in [0, 1, 2, 3, 4, 5]:
... print(value)
...
0
1
4
9
16
25

可以使用“for”循环(迭代)的对象称为迭代器。因此,一个迭代器也就是一个遵循了迭代协议的对象。

内置函数“iter”可以用来创建一个迭代对象,这时使用“next”函数可以来逐步迭代出内容:

>>> my_iter = iter([1, 2, 3])
>>> my_iter
<list_iterator object at 0x10ed41cc0>
>>> next(my_iter)
1
>>> next(my_iter)
2
>>> next(my_iter)
3
>>> next(my_iter)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

当没有更多元素时,迭代器就会抛出“StopIteration”异常。

迭代器类

迭代器可以部署在类中。你只需要重写“next”和“iter”方法即可。 我们写一个模仿“range”函数的类作为例子,作用是返回所有“a”和“b”之间的值:

class MyRange:
    def __init__(self, a, b):
        self.a = a
        self.b = b
 
    def __iter__(self):
        return self

    def __next__(self):
        if self.a < self.b:
            value = self.a
            self.a += 1
            return value
        else:
            raise StopIteration

这样我们每次调用“next”时它都会让存储在内部的a前进,并且返回它的值。当它到达b时,就抛出“StopIteration”异常。

>>> myrange = MyRange(1, 4)
>>> next(myrange)
1
>>> next(myrange)
2
>>> next(myrange)
3
>>> next(myrange)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

最重要的是,你可以将迭代器类用在for循环中:

>>> for value in MyRange(1, 4):
... print(value)
...
1
2
3

迭代器部分练习

  1. 写一个迭代器类,返回的是所有“a”到“b”之间的整数的平方。
  2. 写一个迭代器类,返回所有1到(n)之间的偶数。
  3. 写一个迭代器类,返回所有1到(n)之间的奇数。
  4. 写一个迭代器类,返回所有(n)到0之间的整数。
  5. 写一个迭代器类,返回的是从第一个元素到(n)之间所有的斐波那契数列。你可以回顾下函数部分了解下什么是斐波那契数列。 这是斐波那契数列的前几个数:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
  6. 写一个迭代器类,返回的是所有0到(n)的连续对,如(0, 1), (1, 2), (2, 3)...。

书籍推荐