python中可迭代对象和迭代器的区别


使用pycharm,查看可迭代对象(iterable)和迭代器(iterator)的源码

from collections import Iterable, Iterator

Iterable源码如下:

class Iterable(metaclass=ABCMeta):

    __slots__ = ()

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

    @classmethod
    def __subclasshook__(cls, C):
        if cls is Iterable:
            return _check_methods(C, "__iter__")
        return NotImplemented

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:
            return _check_methods(C, '__iter__', '__next__')
        return NotImplemented

Iterator.register(bytes_iterator)
Iterator.register(bytearray_iterator)
#Iterator.register(callable_iterator)
Iterator.register(dict_keyiterator)
Iterator.register(dict_valueiterator)
Iterator.register(dict_itemiterator)
Iterator.register(list_iterator)
Iterator.register(list_reverseiterator)
Iterator.register(range_iterator)
Iterator.register(longrange_iterator)
Iterator.register(set_iterator)
Iterator.register(str_iterator)
Iterator.register(tuple_iterator)
Iterator.register(zip_iterator)

可以对比出两者的源码,得出结论如下:

(1)可迭代对象包含迭代器,因为迭代器继承自可迭代对象
(2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有__next__方法,其是迭代器。
(3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter____next__方法。


文章作者: 星凌映雪
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 星凌映雪 !
评论
 上一篇
Anaconda的下载、安装及使用 Anaconda的下载、安装及使用
Anaconda是专门用于科学计算的Python发行版,可以很方便地解决多版本Python并存、切换以及各种第三方模块安装的问题。更重要的是,当你下载并安装好Anaconda后,它就已经集成了上百个科学计算的第三方模块,例如numpy,p
下一篇 
Python中is和==的区别 Python中is和==的区别
首先Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值) 判断身份是否相同使用is,其实内部是调用了__cmp__魔法方法 判断值是否相同使用==,其实内部是调用了__eq__魔术方法 cl
2020-05-08
  目录