迭代器都满足两个条件:
1.有 iter 方法
2.有 next 方法
生成器都是迭代器,迭代器不一定是生成器
list, tuple, dict, string 都是 Iterable (可迭代对象)
from collections import Iterable, Iterator
l = [1, 2, 3, 4, 5]
d = iter(l) # 调用 l.__iter__() 方法
print(d) # list_iterator
print(next(d))
print(isinstance(l, list)) # True
print(isinstance(l, Iterable)) # True
print(isinstance(l, Iterator)) # False
print(isinstance(d, Iterator)) # True
运行结果:
<list_iterator object at 0x00000242BD844DA0>
1
True
True
False
True
这里 l 是一个可迭代对象,可迭代对象是一种通俗的叫法,并不是指某种具体的数据类型,list是可迭代对象,dict是可迭代对象,set也是可迭代对象。 d 是迭代器,迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。
迭代器有一种具体的迭代器类型,比如 list_iterator , set_iterator 。
可迭代对象实现了__iter__和__next__方法(python2中是 next 方法,python3是__next__方法),这两个方法对应内置函数 iter() 和 next() 。__iter__方法返回可迭代对象本身,这使得他既是一个可迭代对象同时也是一个迭代器。
for 循环内部三件事
- 调用可迭代对象的 iter 方法返回一个迭代器对象
- 不断调用迭代器对象的 next 方法
- 处理 StopIteration
for l in [1, 2, 3, 4, 5]:
print(l)
运行结果:
1
2
3
4
5