python——迭代器

2020-10-01  本文已影响0人  mutang
  1. 如何判断一个对象是否可以迭代

    from collections import Iterable
    isinstance(obj,Iterable)
    返回一布尔值
    
  2. 可迭代对象的本质

    1. 可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。

      可迭代对象通过__iter__方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.

      ==一个具备了__iter__方法的对象,就是一个可迭代对象==

  3. iter()函数与next()函数

    1. **我们可以对获取到的迭代器不断使用next()函数来获取下一条数据。
    2. iter()函数实际上就是调用了可迭代对象的__iter__方法。
    3. 注意,当我们已经迭代完最后一个数据之后,再次调用next()函数会抛出StopIteration的异常,来告诉我们所有数据都已迭代完成,不用再执行next()函数了
  4. 如何判断一个对象是否是迭代器

    from collections import Interator
    isinstance(obj,Interator)
    返回:布尔值
    
  5. 迭代器

    1. Python3中是对象的__next__方法,Python2中是对象的next()方法

    2. 构造一个迭代器的两个充分条件:

      1. python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可

        def __iter__(self):
            return self
        
      2. 实现它的__next__方法

  6. for...in...循环的本质

    1. 先通过iter()函数获取可迭代对象Iterable的迭代器
    2. 对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item
    3. 当遇到StopIteration的异常后循环结束
  7. 迭代器的应用场景(省内存)

    1. 迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间

    2. 用迭代器实现斐波那契数列:

      # -*- coding: utf-8 -*-
      # _Version__: python 3.8.3
      # __date__  : 2020/10/1
      
      
      class Febonacci():
      
          def __init__(self, all_num):
              self.all_num = all_num
              self.a = 0
              self.b = 1
              self.current_num = 0
      
          def __iter__(self):
              return self
      
          def __next__(self):
              if self.current_num < self.all_num:
                  ret = self.a
                  self.a, self.b = self.b, self.a + self.b
                  self.current_num += 1
                  return ret
              else:
                  raise StopIteration
      
      
      febo = Febonacci(20)
      for num in febo:
          print(num)
      
      
  1. 并不是只有for循环能接收可迭代对象

    li = list(Febonacci(15))
    print(li)
    tp = tuple(Febonacci(6))
    print(tp)
    

    分析:

    1. 从本质上来说,不能认为他们是类型转换
    2. 从迭代器取出一个对象,添加到list或tuple中
    3. 生成列表和元组
上一篇下一篇

猜你喜欢

热点阅读