zoukankan      html  css  js  c++  java
  • Python 可迭代对象和迭代器

    Python 迭代器相关知识点

    1. 可迭代对象

      是一个私有的方法比较多,操作灵活(比如列表,字典的增删改查,字符串的常用操作方法等),比较直观,但是占用内存,而且不能直接通过循环迭代取值的这么一个数据集。

      • 对象:在Python中一切皆对象。

      • 可迭代:循环更新,不是重复,新的内容更替上一代内容。

      • Python中可迭代对象:内部皆含有__iter__方法的对象,就是可迭代对象。

      • 前面了解过的可迭代对象有:str、list、tuple、dict、set、range

      • 可迭代对象取值可以重复往返取值,不受上次读取位置的影响。
      • 判断一个对象是否为可迭代对象的方法:只需判断__iter__是否在该对象的方法列表中
        name = 'amwkvi'
        print('__iter__' in dir(name))		# dir()方法将某个对象所拥有的所有方法以列表形式返回。
        >>>True
        
      • 可迭代对象的优点:
        1. 存储的数据可以直接显示,比较直观。
        2. 拥有方法比较多。
      • 缺点:
        1. 占用内存较多。
        2. 不能直接通过for循环遍历,不能直接取值(索引、key)。
    2. 迭代器

      是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。

      • 定义:器:工具;迭代器:可以更新迭代的工具。

      • 专业描述:一个内部含有__iter__方法和__next__方法的对象,就是迭代器。
      • 迭代器读取对象中的数据时,会从上次读取的位置开始往下读取,不能返回。
      • 举例说明判断过程:目前学到的迭代器只有“文件句柄”一个为迭代器。

        with open('a.txt', mode='w', encoding='utf-8') as f1:
            pass
        print('__iter__' in dir(f1) and '__next__' in dir(f1))
        >>>True
        
      • 可迭代对象可以转化成迭代器:

        使用iter()方法进行转换,用next()方法进行顺序取值
        str1='amwkvi'
        obj=iter(str1)      # obj=str1.__iter__() 方法也可以
        print(obj)
        print(next(obj))    # print(obj.__next__()) 方法也可以
        print(next(obj))	# 第二次next取出第二个元素
        print(next(obj))	# 一次运行里多次next就会连续往下取值
        print(next(obj))    # 但不能超过元素最大数目,否则报错。
        >>><str_iterator object at 0x000002848C79CE08>
        a
        m
        w
        k
        
      • 迭代器的优点:

        1. 节省内存:每次读取一个元素,读取到下一个数据时,上一个数据就会从内存中消失。
        2. 惰性机制:next一次,取一个值,绝对不会多取。
      • 迭代器的缺点:

        1. 速度慢:以时间换空间。
        2. 取值不走回头路,只能按顺序往下走,不能返回取值。
    3. 可迭代对象和迭代器的对比

      • 数据读取方面:

        • 可迭代对象:读取数据时可以重复往返取值,不受上次读取位置的影响。
        • 迭代器:读取对象中的数据时,会从上次读取的位置开始往下读取,不能返回。
      • 应用方面:

        • 可迭代对象:是一个私有的方法比较多,操作灵活(比如列表,字典的增删改查,字符串的常用操作方法等),比较直观,存储数据相对少(几百万个对象,8G内存是可以承受的)的一个数据集。

          当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。

        • 迭代器:是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。

          当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)。

    4. 利用while循环模拟for循环遍历可迭代对象

      # 用while循环模拟for循环遍历可迭代对象
      list1 = ['abc', 11, 66, 22, 'aef', 44, 'internet', 'H3C', 'Open', 88]       # 创建列表,可迭代对象
      obj = iter(list1)               # 将可迭代对象转换为迭代器
      while 1:                        # while循环开始
          try:                        # 试着运行以下语句
              print(next(obj))        # 用next方法逐个输出包含的元素
          except StopIteration:       # 出现StopIteration错误时
              break                   # 中止循环
      
  • 相关阅读:
    JS常见错误和分析
    angularjs 笔记(1) -- 引导
    各大浏览器hack
    AngularJS 配置和运行phonecat错误
    npm start 作用
    $.prop()和$.attr() 区别用法
    HDU 1251 统计难题 (Tire树)
    Luogu P3370 【模板】字符串哈希
    Luogu P3385 【模板】负环
    LuoguP1563 玩具谜题
  • 原文地址:https://www.cnblogs.com/amwkvi/p/13442699.html
Copyright © 2011-2022 走看看