Iterable:可迭代的
Iterator:迭代器
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
Python中 list/truple/str/dict这些都可以被迭代(Iterable),但他们并不是迭代器(Iterator)。为什么?
因为和迭代器(Iterator)相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,也就是说有多少事可知的。但迭代器不是,迭代器不知道要执行多少次,所以可以理解为不知道有多少个元素,每调用一次next(),就会往下走一步,是惰性的。
通俗一点的解释:
凡是可以for循环的,都是Iterable
凡是可以next()的,都是Iterator
集合数据类型如list/truple/dict/str,都是Itrable不是Iterator,但可以通过iter()函数获得一个Iterator对象
Python中的for循环本质上就是通过不断调用next()函数实现的。
判断是不是可以迭代,用Iterable和isinstance()
from collections import Iterable
isinstance({}, Iterable) --> True
isinstance((), Iterable) --> True
isinstance(100, Iterable) --> False
判断是不是迭代器,用Iterator和isinstance()
from collections import Iterator
isinstance({}, Iterator) --> False
isinstance((), Iterator) --> False
isinstance( (x for x in range(10)), Iterator) --> True
迭代器提供了一个统一的访问集合的接口。只要是实现了__iter__()或__getitem__()方法的对象,就可以使用迭代器进行访问。
创建迭代器对象
使用内建的工厂函数iter(iterable)可以获取迭代器对象:
语法:
iter(collection) -> iterator
iter(callable,sentinel) -> iterator
说明:
Get an iterator from an object.
In the first form, the argument must supply its own iterator, or be a sequence.
In the second form, the callable is called until it returns the sentinel.
使用对象内置的__iter__()方法生成迭代器
1 >>> L1 = [1,2,3,4,5,6]
2 >>> l1 = L1.iter()
3 >>> print(l1)
4 <list_iterator object at 0x0000000002F3A828>
5 >>> l1.next()
6 1
7 >>> l1.next()
8 2
9 >>> l1.next()
10 3
11 >>> l1.next()
12 4
13 >>> l1.next()
14 5
使用内置工厂函数生成迭代器
1 >>> L1 = [1,2,3,4,5,6]
2 >>> I2 = iter(L1)
3 >>> print I2
4 <list_iterator object at 0x0000000002F3A7B8>
5 >>> I2.next()
6 1
7 >>> I2.next()
8 2
9 >>> I2.next()
10 3