Image Description

给定一个list或tuple,通过 for 循环来遍历,这种遍历就叫做迭代,是访问集合元素的一种方式。

Python中的迭代器指遵循迭代器协议的对象。迭代器有两个相关概念:迭代和可迭代对象。迭代概念上面解释了;可迭代对象指的是可以用for循环进行迭代的对象。

遵循迭代器协议指的是实现对象的 iter() 和 next()方法。

斐波那契数列迭代器

# -*- coding: utf-8 -*-

from collections import Iterator

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1

    # 返回迭代器对象本身
    def __iter__(self):
        return self

    # 返回容器下一个元素
    def next(self):
        self.a, self.b = self.b, self.a + self.b
        return self.a

def main():
    fib = Fib()    # fib 是一个迭代器
    print 'isinstance(fib, Iterator): ', isinstance(fib, Iterator)

    for i in fib:
        if i > 10:
            break
        print i

if __name__ == '__main__':
    main()

运行代码

isinstance(fib, Iterator):  True
1
1
2
3
5
8

在上面的代码中,我们定义了一个 Fib 类,用于生成 Fibonacci 数列。

在类的实现中,我们定义了 iter 方法,它返回对象本身,这个方法会在遍历时被 Python 内置的 iter() 函数调用,返回一个迭代器。

类中的 next() 方法用于返回容器的下一个元素,当使用 for 循环进行遍历的时候,就会使用 Python 内置的 next() 函数调用对象的 next 方法(在 Python3 中是 next 方法)对迭代器进行遍历。

总结

1.元组、列表、字典和字符串对象是可迭代的,但不是迭代器,不过我们可以通过 iter() 函数获得一个迭代器对象。

2.Python 的 for 循环实质上是先通过内置函数 iter() 获得一个迭代器,然后再不断调用 next() 函数实现的。

3.自定义迭代器需要实现对象的 iter() 和 next() 方法(注意:Python3 要实现 next() 方法),其中,iter() 方法返回迭代器对象本身,next() 方法返回容器的下一个元素,在没有后续元素时抛出 StopIteration 异常。