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就是一个可迭代的对象,用一行取一行

  

 

posted @ 2018-03-25 18:16  Reid21  阅读(90)  评论(0编辑  收藏  举报