Python 可迭代对象与迭代器的对比

可迭代对象:使用 iter 内置函数可以获取迭代器的对象,如果对象实现了能返回迭代器的 __iter__ 方法,那么对象就是可迭代的,实现了 __getitem__ 方法,而且其参数是从零开始的索引,这种对象也可以迭代。

迭代器:迭代器是这样的对象:实现了无参数的 __next__ 方法,返回序列中的下一个元素,如果没有元素了,那么抛出的 StopIteration 异常。Python 中的迭代器还实现了 __iter__ 方法,因此迭代器可以迭代。

标准的迭代器接口有两个方法:

__next__ :返回下一个可用的元素,如果没有元素了,抛出 StopIteration

__iter__:返回 self ,以便在应该使用可迭代对象的地方使用迭代器,例如在 for 循环里。

因为迭代器只需 __next__ 和 __iter__ 两个方法,所以除了调用 next( ) 方法,以及捕获 StopIteration 异常之外,没有办法检查是否还有遗留的元素,此外,也没有办法还原迭代器。如果想再次迭代,那就要调用 iter( ) ,传入之前构建迭代器的可迭代对象,传入迭代器本身没用, Iterator.__iter__ 方法的实现方式是返回实例本身,所以传入迭代器无法还原已经耗尽的迭代器。

Iterator 抽象基类:

class Iterator(Iterable):
    __slots__ = ()
    @abstractmethod
    def __next__(self):
       'Return the next item from the iterator.When exhausted,raise StopIteration'
        raise StopIteration
    
    def iter(self):
        return self
   
    @ classmethod
    def __subclasshook__(cls,C):
        if cls is Iterator:
           if (any('__next__' in B.__dict__ for B in C.__mro__) and any('__iter__' in 
               B.__dict__ for B in C.__mro__)):
                return True
        return NotImplemented

可迭代对象有个 __iter__ 方法,每次实例化一个新的迭代器,而迭代器要实现 __next__ 方法,返回单个元素,此外还要实现 __iter__ 方法,返回迭代器本身。因此迭代器可以迭代,但是可迭代的对象不是迭代器。

迭代器模式可用来:

1.访问一个聚合对象的内容而无需暴露它的内部接口

2.支持对聚合对象的多种遍历

3.为遍历不同的聚合结构提供一个统一的接口(即支持多态迭代)

为了支持多种遍历,必须能从同一个可迭代的实例中获取多个独立的迭代器,而且各个迭代器要能维护自身的内部状态,因此这一模式正确的实现方法是,每次调用 iter 都新建一个独立的迭代器。

 

你可能感兴趣的:(Python学习)