Python全栈

17.Python之迭代器

2020-02-13  本文已影响0人  免跪姓黄

Python之迭代器

  1. 可迭代对象

    内部含有__iter__方法的对象,称之为可迭代对象。

  2. 通过dir()获取一个对象内部的所有方法

    s = 'Python'
    print(dir(s))   # 返回对象s内部的所有方法
    '''
    输出结果:
    ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
    '''
    
  3. 判断一个对象是不是一个可迭代对象(检查一个对象中是否含有__iter__方法)

    s = 'Python'
    print('__iter__' in dir(s))    # 返回 True 即为可迭代对象
    
  4. 可迭代对象的优缺点

    • 优点:
      • 存储的数据可以直观的显示出来
      • 内置的方法较多
    • 缺点:
      • 占用内存
      • 不能一个一个的直接取值(for循环通过内部迭代器转化后才实现的直接取值)
  5. 迭代器

    内部含有__iter____next__方法的对象就是迭代器,也正是因为有__next__方法,才使得可迭代对象可以通过for循环直接取值。

  6. 迭代器的作用

    • 迭代是Python中最强大的功能之一,当处理一个远大于内存容量的数据时,需要找到一种节省内存的惰性获取数据项的方式,即按需一次获取一个数据项,以达到节省内存的作用,这就是迭代器模式。
  7. 判断一个对象是不是一个迭代器(检查一个对象中是否同时含有__iter____next__方法)

    with open(r'file_path', mode='r') as f:
       print('__iter__' in dir(f) and '__next__' in dir(f))    # 返回 True 即为迭代器
    
  8. 通过内置函数iter()将可迭代对象转化成迭代器,也可以通过可迭代对象.__iter__()进行转化

  9. 通过内置函数next()可以对一个迭代器取值,一个next()取一个值,也可以通过可迭代对象.__next__()取值

  10. 迭代器的优缺点

    • 优点:
      • 惰性机制,next一次,取一个值,绝不多取,因此非常节省内存
    • 缺点:
      • 速度慢,以时间换空间
      • 单向取值时不能反向取值
  11. 可迭代对象与迭代器的区别

    • 可迭代对象的操作方法较多,存储的数据能够直观的全部显示出来的一个数据集;当侧重于对数据可以灵活处理,并且内存空间足够(8G内存大约能够支撑可迭代对象中的几百万个数据),将数据集设置为可迭代对象是很好的选择。
    • 迭代器是一个只有next()方法,存储的数据不能直观的全部显示出来的一个数据集,当数据集中的数据量过于庞大,超出了内存可以使用的范围时,或不确定数据集中的数据量的时候,将数据集设置为迭代器是很好的选择。这就是文件句柄为什么设置为迭代器的原因。
  12. while循环模拟for循环的机制

    • 方式一:

      l = [1,2,3,4,5,6,7,8,9]
      # 将可迭代对象转换为迭代器
      obj = iter(l)
      count = 0
      # 对迭代器循环取值
      while count < len(l):
         data_elements = next(obj)
         print(data_elements)
         count += 1
      
    • 方式二:(利用异常处理)

      l = [1,2,3,4,5,6,7,8,9]
      # 将可迭代对象转换为迭代器
      obj = iter(l)
      # 对迭代器循环取值
      while 1:
         try:
            data_elements = next(obj)
            print(data_elements)
      
上一篇 下一篇

猜你喜欢

热点阅读