• 迭代器


    我们之前一直用可迭代的对象像list/dict/tuplew/set到底什么是可迭代对象,什么是迭代器!

    可迭代协议-------只要含有"__iter__"方法的数据类型都是可迭代的

    迭代器协议-----含有"__next__"和"__iter__"方法的变量/值都是迭代器

    __length_hint__ 表示迭代器中有多少元素

    __setstate__ 控制迭代器从第几个迭代

    __next__ 从迭代器中取下一个值

    可迭代的怎么变成迭代器:

       可迭代变量.__iter__

    l=[1,2,3,4]
    l_iter=l.__iter__()  #获取迭代器
    print(l_iter.__next__())   获取一个值 1
    print(l_iter.__next__())  获取值2
    print(l_iter.__next__())  获取值3
    print(l_iter.__next__())  获取值4
    print(l_iter.__next__())   StopIteration   没有值可以取 一旦出现StopIteration不会报错,直接执行break

     ##在迭代器中值取一次就没有了 

    迭代器的特点:节省内存,惰性运算,一次性取值

      具有next和iter方法

      通过一个next多次执行就可以获得所有这个容器中的值

      迭代器的值只能取一次

      不取值的时候,值不会出现

    检查变量是不是不可迭代的

    第一种:

      print("__iter__" in dir[])

    dir([]) 内置函数  查看一个数据类型内部有哪些方法

    两边带有下划线的方法叫"魔术方法","双下方法","内置方法"

    整数内部是不含有"__iter__"的方法

    第二种:

      from collections improt Iterable

      print(isinstance({},Iterable))

    内置函数,判断一个具体的值是不是可迭代的,如果可以返回Turn,如果不可迭代返回False

    for循环值:内部的机制就是迭代器取值的机制

      在for循环执行的过程中:先把可迭代的变成一个迭代器,然后在从中一个一个的取值

      range生成的就是一个迭代器,创建这个迭代器并不会真的把迭代器中的所有数据一次性生成

    什么时候生成呢?

      只有通过next取值的时候才会生成

      迭代器的作用就是节省内存,for循环就是利用迭代器节省内存的特点来对python当中的变量来进行操作的

    for循环的本质:

      1.生成迭代器

      2.循环每一次对这个迭代器执行next

      3.并且到迭代器最后停止

    for循环和可迭代的关系:

      迭代器都是可迭代的

      迭代器是特殊的存在

    for循环和迭代器的关系:

      无论是可迭代的还是迭代器都可以被for循环

      如果直接循环迭代器,那么就循环一次

      如果循环非迭代器,那么每次循环都是从头开始

    用while循环实现for循环
    l = [1,2,3,5,6,7,12,23,412]
    l_iter = l.__iter__()
    while True:
        try:   # 要保护的代码
            print(l_iter.__next__())
        except StopIteration:  # 要保护的代码中一旦出现了StopIteration错误,程序不报错,直接执行break
            print('报错啦')
    

      

  • 相关阅读:
    钾 动态规划
    镁 细节
    锌 填坑计划
    钠 GZY整理贪心
    javascript+Java 实现MD5加密登录密码
    FCKeditor2.6.4图片上传,中文名乱码,红叉各种问题解决
    Java 随机生成验证码,支持大小写字母、数字、随机字体
    BI BI系统监控
    使用ETL控件还是存储过程
    fsync与数据库日志刷新
  • 原文地址:https://www.cnblogs.com/lilei1996/p/9917559.html
Copyright © 2020-2023  润新知