迭代器
Iterable:可迭代的
列表,字典,元组,字符串,集合这些可以循环的都是可迭代的。
还有一类是生成器(generator),生成器都是可迭代的。
下面的列子都是可迭代的。
from collections import Iterable print(isinstance([],Iterable)) print(isinstance((),Iterable)) print(isinstance({},Iterable)) print(isinstance("abc",Iterable)) a = (i for i in range(10)) print(isinstance(a,Iterable)) def func(max): n,a,b = 0,1,2 if n < max: a,b = b,a+b yield b n += 1 f = func(10) print(isinstance(f,Iterable))
迭代器:Iterator
可以被next函数调用并不断返回下一个值的对象称为迭代器。我们目前学的迭代器只有生成器。
生成器都是可迭代的对象,但是字典,列表,元组,集合等虽然是可迭代的,但并不是生成器。
from collections import Iterator print(isinstance([],Iterator)) print(isinstance({},Iterator)) print(isinstance((),Iterator)) print(isinstance("abc",Iterator)) print(isinstance(set(),Iterator)) print(isinstance((i for i in range(10)),Iterator)) def func(max): n,a,b = 0,1,1 if n < max: a,b = b,a+b yield b n += 1 f = func(15) print(isinstance(f,Iterator))
元组,字典,列表等虽然不是迭代器,但是我们可用iter()函数将其变为迭代器。
print(isinstance(iter([]),Iterator)) print(isinstance(iter({}),Iterator)) print(isinstance(iter(()),Iterator))
a = [1,2,3,4,5] #用iter()函数将列表a变为迭代器,可用next()函数 m = iter(a) print(next(m)) print(next(m))
总结:迭代器对象表示的是一个数据流,不知道具体数量,只能用next()函数一个一个输入出来到最后到最后一个数后报错,才能知道这个迭代器有多少元素。
列表被iter()函数转换为迭代器后,并不能用leng()来查看列表的长度(没转换前可以),只能用next()一个一个唤醒并返回值后才能知道有多少元素。
凡是可作用于next的对象都是一个迭代器类型,他们表示一个惰性序列。
越是困难的事越要立即去做,这样收益才会最大!!!