前言
打算写一系列文章来记录自己学习 Python 3 的点滴;
本章节主要介绍的是有关 Python 的 Iterator 和 Iterable 之间的异同;
本文为作者的原创作品,转载需注明出处;
源码分析
Iterable
首先看看 python 源码中有关 Iterable 的源码,
collections.py
1 | class Iterable(object): |
可见,Iterable 对象中实现了内置方法__iter__用于迭代;
Iterator
看看 python 源码中有关 Iterator 的源码,
1 | class Iterator(Iterable): |
注意,Iterator 对象继承自 Iterable,并额外实现了内置方法__next__;其实,该方法就是为了支持 Python 的内置函数next(iterator)的调用;还要注意的是,Iterator 继承自 Iterable,所以它可以被 for 语句进行迭代;
next(iterator)
builtins.py
1 | def next(iterator, default=None): # real signature unknown; restored from __doc__ |
next(iterator)函数是 Python 的一个内置的默认函数,接受一个 Iterator 对象,并返回 next item;next函数中,调用的正是 Iterator.__next__方法获取 next item 的;当取值完毕以后,抛出StopIteration的错误;
特性分析
归纳起来,python 中,list、tuple、dict、set、str以及generator都是 Iterable 类型;
1 | from collections import Iterable |
可见,字符串是Iterable类型的;
从 Iterable 和 Iterator 的源码分析中,我们可以知道,两者的区别是,只有 Iterator 支持使用 next() 内置函数进行迭代的调用;而其他的类型仅仅支持 for 循环的调用方式;
Iterable -> Iterator
python 提供了这样一个内置方法iter(),可以将Iterable对象转换为Iterator对象;
builtins.py
1 | def iter(source, sentinel=None): # known special case of iter |
从源码的注释中可以看到,可以通过调用iter(iterable)将iterable转换为iterator;
1 | r = iter('ABC') |
这样,我们将’ABC’转换为了Iterator,于是乎,我们可以通过调用 next 方法来迭代了;
总结
Python 就这两种迭代类型,做到融会贯通以后,以后,见到不同种类的迭代类型就知道该如何直接下手了;