zoukankan      html  css  js  c++  java
  • python迭代器

    迭代器

    一、可迭代对象

    • 可迭代对象

      • 字面意思:对象?python中一切皆对象。一个实在存在的值,对象
      • 可迭代?:更新迭代,重复的,循环的一个国产,每一次都不太一样!(比如你爷爷生你爸爸,你爸爸生你,你生你儿子)
      • 可迭代对象:可以循环更新的,一个实实在在的值!!!
      • 专业角度:内部含有‘——iter——’方法的对象,就叫可迭代对象
      • 学过的可迭代对象:str、list、dict、tuple、set、range、文件句柄
    • 优点:

      • 存储的数据能直接显示,比较直观
      • 拥有的方法比较多,操作方便
    • 缺点:

      • 占内存大
      • 不能直接通过for循环,不能直接取值(索引、key)
    #实际上是解释器做了封装,要不然不能直接循环遍历
    li = [1,2,3,4]
    for i in li:
        print(i)
    
    • 代码判断是否是可迭代对象
    # dir(),作用获取一个对象的所以方法,有__iter__就是可迭代对象
    s = "tzh"
    print('__iter__' in dir(s))
    #返回true
    

    二、迭代器

    • 定义:

      • 字面意思:可更新迭代的工具
      • 专业角度:内部含有‘——iter——’或者‘——next——’方法的对象就是迭代器
    • 判断方法:

      # dir(),作用获取一个对象的所以方法,有__iter__就是可迭代对象
      li = ["tzh"]
      print('__iter__' in dir(li) and '__next__' in dir(li))
      
    2.1、可迭代对象转换成迭代器
    • 优点:
      • 节省内存
      • 惰性机制,取值一次取一个!
    • 缺点:
      • 速度慢
      • 不走回头路,只能next,不能回去
    s = 'tzhqwe'
    obj = iter(s)   #等价于s.__iter__()
    print(obj)      #是不可以直接看到数据的
    
    #那怎么看呢?
    #这样只打印第一个字母,也就是t
    #next一次打印一次,多了会报错哦
    print(next(obj)) #等价于obj.__next__()
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    
    ------
    li = [1,2,3,4,5]
    obj = iter(li)
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    

    三、可迭代对象与迭代器对比

    • 可迭代器对象是一个操作方法比较多,输出比较直观,存储数据相对少的数据集
      • 应用:测重于对数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。(说白了,丢到字典、列表里面)

    • 是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
      • 应用:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)。
  • 相关阅读:
    CentOS下使用crontab命令来定时执行任务
    java调用wkhtmltopdf生成pdf文件,美观,省事
    ElasticSearch-5.3.1集群环境搭建,安装ElasticSearch-head插件,安装错误解决
    Jfinal QuartzPlugin 简单使用案例
    tampermonkey,采用js解析自定义脚本,实现网页列表数据采集分析
    安装Elasticsearch5.0 部署Head插件
    Springmvc中配置Quartz使用,实现任务实时调度。
    IDEA异常解决: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
    js jquery 实现html页面之间参数传递(单一参数、对象参数传递)
    ajaxfileupload 实现多文件上传
  • 原文地址:https://www.cnblogs.com/hsyw/p/13611456.html
Copyright © 2011-2022 走看看