• 迭代器


    • 迭代器
        • 可迭代对象(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循环
  • 相关阅读:
    数字形式转换
    货币转换
    温度转换
    volatile 的可见性,禁止指令重排序,无法保证原子性的理解
    mysql索引的结构的分析
    史上最详细的ORACLE19c安装说明
    Solaris 修改联网代理的设置
    Oracle Drop表并未直接删除 drop table xx purge
    oracle自定义函数创建函数索引
    连线法合并两个有序链表
  • 原文地址:https://www.cnblogs.com/golangav/p/7291110.html
Copyright © 2020-2023  润新知