前言
打算写一系列文章来记录自己学习 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 | 'ABC') r = iter( |
这样,我们将’ABC’转换为了Iterator
,于是乎,我们可以通过调用 next 方法来迭代了;
总结
Python 就这两种迭代类型,做到融会贯通以后,以后,见到不同种类的迭代类型就知道该如何直接下手了;