可以被next()函数调用并不断返回下一个值的对象称为迭代器 iterator
生成器是迭代器,但迭代器不一定是生成器
把可迭代对象(比如list,dict,str)变成迭代器的方法是 iter()
python 的 iterator对象表示的是数据流,数据流可以看做是一个有序序列,
iterator只有在需要下一个数据的时候才会计算
iterator 可以表示一个无限大的数据流,比如说全体自然数。之所以可以表示,是因为
只有在需要的时候才会计算下一个自然数的值,而不会存储全部自然数
from collections import Iterable,Iterator
Iterable:可迭代
Iterator:迭代器
#可迭代对象
a = isinstance([1,2,3],Iterable)
b = isinstance('123',Iterable)
c = isinstance((1,2,3),Iterable)
d = isinstance(set([1,2,3]),Iterable)
e = isinstance({1:2,2:3},Iterable)
print(a,b,c,d,e)
#True True True True True
isinstance(a,b),是检查a对象是否是b类型的示例
以上可以见得,list str tuple set dict都是可迭代对象
a = isinstance([1,2,3],Iterator)
b = isinstance('123',Iterator)
c = isinstance((1,2,3),Iterator)
d = isinstance(set([1,2,3]),Iterator)
e = isinstance({1:2,2:3},Iterator)
print(a,b,c,d,e)
#False False False False False
说明他们只是可迭代对象,并非迭代器
a = isinstance(iter([1,2,3]),Iterator)
b = isinstance(iter('123'),Iterator)
c = isinstance(iter((1,2,3)),Iterator)
d = isinstance(iter(set([1,2,3])),Iterator)
e = isinstance(iter({1:2,2:3}),Iterator)
print(a,b,c,d,e)
#True True True True True
如上,我们可以参考一个可迭代对象,生成一个迭代器
#迭代器函数
def fib(num):
#斐波拉契数列
a,b = 0,1
for i in range(num):
yield b
a,b = b,a+b
gen = fib(10)
a = isinstance(gen,Iterator)
print(a)
#True
可以说明迭代器函数生成的的确是迭代器