Python攻克之路-迭代器
迭代器
描述:生成器是迭代器,迭代器不一定是生成器,生成器可以调用next方法,因为生成器本身满足迭代器协议,但是生成器更优雅可以使用yield实现,当调用next时,是封装在yield里,所以yield封闭iter和next,使用起来更加优雅(在了解生成器的基础上看迭代器,理念相似)
迭代器协议条件:a. 有iter方法
b. 有next方法
1.iter: 列表、元组、字典、字符串都是可迭代对象,有inter方法
In [9]: b=[1,2,3,4] In [10]: b.__iter__() Out[10]: <list_iterator at 0x7f43809aac88> In [11]: iter(b) #建议使用内置方法,iter返回一个迭代器对象 Out[11]: <list_iterator at 0x7f43809af128> In [16]: k=iter(b) In [17]: next(k) Out[17]: 1 In [18]: next(k) Out[18]: 2
2.for循环实现迭代器的操作
a. 调用可迭代iter方法,把in后面的内容转换成可迭代对象,如
for i in [1,2,3]: #列表本本身没有next的方法,使用了iter方法 iter([1,2,3])
b. 不断调用迭代器对象的next方法
c. 处理stopIteration异常
3.判断数据类型
In [19]: from collections import Iterator,Iterable In [20]: l=[2,4,5,6] In [21]: d=iter(l) In [22]: print(isinstance(l,list)) True In [23]: print(isinstance(l,Iterable)) #是否可迭代对象 True In [24]: print(isinstance(l,Iterator)) #l不是迭代器 False In [25]: print(isinstance(d,Iterator)) #d是迭代器 True
4.文件中使用迭代器
f=open('ab.txt','r') for i in f.readlines() #readlines是把每行的都放进内存,如果文件大,就会大大降低性能 for i in f: #这里的f就是一个可迭代的对象,用一行取一行