欢迎来到Louis的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
扩大
缩小

Python迭代器

一. 什么是迭代

#迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。 
每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。

while True:  >> 这种重复执行同一个操作的形式,不叫迭代,
    pass


count = 0
while count < 5:   >>这种叫做迭代
     count+=1

二. 什么是可迭代对象?什么是迭代器?两者有什么区别

#1.什么是可迭代对象
对象拥有内置方法__iter__的,是可迭代对象,即可使用obj.__iter__()方法的对象
字符串,列表,字典,文件对象都是可迭代对象
dir(obj)可以查看对象所拥有的方法
使用collections模块的Iterable方法 配合isinstance可以进行可迭代对象的类型检查


#什么是迭代器
可迭代对象调用__iter__()方法得到的结果就是迭代器。
迭代器对象指的是既有__iter__方法又有__next__方法的对象。

文件类型就是可迭代对象
open("tets.txt","r").__iter__()
open("text.txt","r").__next()

#迭代器一定是可迭代对象,而可迭代对象不一定是迭代器
迭代器拥有__next__方法,list是可迭代对象,而list就没有__next__就不是迭代器

三. 迭代器对象的使用

#迭代器可以使用__next__方法来获取迭代器中的值,每次调用一次就获取一个,如果迭代器中没有数据了,再次调用__next__就就抛出StopIteration的异常。

s = "python".__iter__()
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
#print(s.__next__())  此时迭代器为空,在次调用__next__会抛出异常。

由于该方法会抛出异常,python就另寻他法,我们使用for循环要读取。
#基于for循环,我们可以完全不再依赖索引去取值了
dic={'a':1,'b':2,'c':3}
for k in dic:
    print(dic[k])

#for循环的工作原理
#1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic
#2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
#3: 重复过程2,直到捕捉到异常StopIteration,结束循环

五. 迭代器的优缺点

#优点:
  - 提供一种统一的、不依赖于索引的迭代方式
  - 惰性计算,节省内存,在大文件操作时就体现出惰性计算的好处了
#缺点:
  - 无法获取长度(只有在next完毕才知道到底有几个值)
  - 一次性的,只能往后走,不能往前退

posted on 2018-08-09 20:49  Louiszj  阅读(83)  评论(0编辑  收藏  举报

导航