跳转至

迭代器


代码1

from collections.abc import Iterable, Iterator


class MyIterable:
    def __iter__(self):
        pass

class MyIterator:
    def __iter__(self):
        pass

    def __next__(self):
        pass


def main():
    print(isinstance(MyIterable(), Iterable))
    print(isinstance(MyIterable(), Iterator))
    print(isinstance(MyIterator(), Iterable))
    print(isinstance(MyIterator(), Iterator))

if __name__ == '__main__':
    main()

输出:

True
False
True
True

解释:

MyIterable 实现了 __iter__ 表示该对象可迭代

MyIterator 实现了 __iter____next__ 表示该对象是迭代器

代码2

class FibIterator:
    """斐波那契数列迭代器"""

    def __init__(self, num):
        self.num = num
        self.fisrt = 1
        self.second = 1
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index < self.num:
            self.index += 1
            item = self.fisrt
            self.fisrt, self.second = self.second, self.fisrt + self.second
            return item
        else:
            raise StopIteration


def main():
    for i in FibIterator(6):
        print(i)

    print()

    fi = FibIterator(6)
    print(next(fi))
    print(next(fi))
    print(next(fi))
    print(next(fi))
    print(next(fi))
    print(next(fi))

输出:

1
1
2
3
5
8

1
1
2
3
5
8

解释:

  • iter() 就是通过__iter__获取迭代器, 所以要返回自己, 也就是 return self
  • next() 本质就是通过迭代器的__next__方法获取值, 也就是 return item,直至遇到StopIteration异常
  • for 循环的本质是先通过 iter() 函数获取可迭代对象的迭代器, 不断使用 next() 方法调用迭代器, 获取下一个值并赋值给 item, 直到遇到 StopIteration 异常后结束循环