迭代器

  • 迭代器
      • 可迭代对象(iterable)
        • 概念
          • 实现了迭代器协议的对象(只要对象本身有__iter__方法,那它就是可迭代的)
          • 可以直接作用于for循环的对象统称为可迭代对象
        • 判断一个对象是否可迭代对象
          • 1. isinstance()
          • 使用isinstance()判断一个对象是否是Iterable对象(再用这个方法的时候一定记得调用模块)
          • from collections import Iterable
          • print(isinstance([],Iterable))
          • # True    列表是可迭代对象
          • print(isinstance({},Iterable))
          • # True    字典是可迭代对象
          • print(isinstance('abc',Iterable))
          • # True    字符串是可迭代对象
          • print(isinstance((x for x in range(10)),Iterable))
          • # True    生成器是可迭代对象
          • print(isinstance(100,Iterable))
          • # False    数字不是可迭代对象<br><br>
          • 2. 可以引用 .__iter__
          • 另一种是Python内置方法中有 .__iter__ 方法,如果能引用该方法的对象都是可迭代对象(.__iter__方法调用后的执行结果就是迭代器
        • 对象
          • 字符串  列表  元组  字典  集合 文件句柄 
      • 迭代器 (Iterator)
        • 概念
          • 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
        • 判断
          • from collections import Iterator
          • print(isinstance((x for x in range(10)), Iterator))
          • # True    生成器是迭代器
          • print(isinstance([], Iterator))
          • # False    列表不是迭代器
          • print(isinstance({}, Iterator))
          • # False    字典不是迭代器
          • print(isinstance('abc', Iterator))
          • # False    字符串不是迭代器<br><br>
        • 对象
          • 文件句柄
          • 文件句柄既能被next()函数调用又能被iter()函数调用,所以文件既是迭代器,又是可迭代对象
        • 事例
          • while
          • d={'a':1,'b':2,'c':3}
          • i=d.__iter__()
          • #i=iter(d)#和上面的等式一模一样   i就是迭代器
          • print(i.__next__())#等同于下面
          • print(next(i))#等同于上面
          • print(i.__next__())
          • print(i.__next__())#因为字典中的key只有3个,所以在这里会报错,因为超出了范围
          •  
          • ---------------------------------------------------
          • #报错内容是StopIteration,下面就一起消除这个报错吧
          •  
          • d={'a':1,'b':2,'c':3}
          • i=d.__iter__()#这是一个iter函数,等同于iter(d)  i就是迭代器
          • #i=iter(d)#和上面的等式一模一样   i就是迭代器
          • while True:                    
          •     try:   #try...except捕捉异常,看是否出现StopIteration这个异常,如果出现执行break,相当于一个if判断
          •         print(next(i))
          •     except StopIteration:
          •         break
          •  
          • 列表的例子:
          •  
          • l=['a','b','c','d','e']
          • i=l.__iter__()
          • # i=iter(i)
          • while True:
          •     try:                        #try...except捕捉异常
          •         print(next(i))
          •     except StopIteration:
          •         break
          • 文件
          • f=open("a.txt","r")
          • i=f.__iter__()
          • while True:
          •     try:
          •         print(next(i),end="")
          •     except StopIteration:
          •         break
          • for
          • d={'a':1,'b':2,'c':3}
          • for in d:#for循环在这里做的事可以理解为 d=d.__iter__(),牛逼!
          •     print(k)
          • #而且for循环自动加了next()函数,自动next下一个,牛逼!
          • #而且for循环把while循环当中的try...except所做的是给做了,牛逼!
          •  
          • s={1,2,3,4}#for循环列表
          • for i in s:
          •     print(i)
          •  
          • with open("a.txt","r") as f:
          •     for line in f:
      • 两者区别
      • 文件句柄既能被next()函数调用又能被iter()函数调用,所以文件既是迭代器,又是可迭代对象
      • 字符串,列表,元组,字典,集合都不是迭代器,是可迭代对象
      • 整形不是可迭代对象,所以更不可能是迭代器
        • 迭代器
          • 1.独有.__next__方法
          • 2.也有.__iter__方法
          • 3.迭代器.__iter__()后还是迭代器
        • 可迭代对象
          • 1.有.__iter__方法
      • 优缺点
        • 优点
        • #优点
        • # 1:迭代器提供了一种不依赖于索引的取值方式,这样就可以遍历那些没有索引的可迭代对象了(字典,集合,文件)
        • # 2:迭代器与列表比较,迭代器是惰性计算的,更节省内存
        • 缺点
        • #缺点:
        • # 1:无法获取迭代器的长度,使用不如列表索引取值灵活
        • # 2:一次性的,只能往后取值,不能倒着取值
      • 用途
        • for循环

 

posted @ 2017-08-05 19:04  golangav  阅读(485)  评论(0编辑  收藏  举报