• 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                   # 中止循环
      
  • 相关阅读:
    URAL 2067 Friends and Berries (推理,数学)
    URAL 2070 Interesting Numbers (找规律)
    URAL 2073 Log Files (模拟)
    URAL 2069 Hard Rock (最短路)
    URAL 2068 Game of Nuts (博弈)
    URAL 2066 Simple Expression (水题,暴力)
    URAL 2065 Different Sums (找规律)
    UVa 1640 The Counting Problem (数学,区间计数)
    UVa 1630 Folding (区间DP)
    UVa 1629 Cake slicing (记忆化搜索)
  • 原文地址:https://www.cnblogs.com/amwkvi/p/13442699.html
Copyright © 2020-2023  润新知