Python之迭代器

迭代器

  • 迭代:

    • 通过for循环遍历"对象”的每一个元素的过程。
    • 这里的对象指的就是可迭代对象。因此记住:for循环遍历的只能是可迭代的对象。
  • 可迭代对象:

    • 在Python中,list/tuple/string/dict/set/bytes都是可以迭代的数据类型/可迭代对象!
  • 如何判定一个对象是否为可迭代对象呢?
    • 可以通过collections模块的Iterable类型作用在isinstance中来判断一个对象是否可迭代
    • from collections import Iterable     #Iterable迭代类型
      class Test():
          pass
      
      alist = [1,2,3]
      str = 'bobo'
      test = Test()
      
      print(isinstance(alist,Iterable))
      print(isinstance(str,Iterable))
      print(isinstance(test,Iterable))
      
  • 迭代器

    • 迭代器是一种可以被遍历的对象,并且能作用于next()函数。
    • 性质:
      • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往后遍历不能回溯,不像列表,你随时可以取后面的数据,也可以返回头取前面的数据。
    • 迭代器通常要实现两个基本的方法:iter()next()
    • 注意:
      • 可迭代对象并不一定是迭代器!
      • 常见的数据结构,字符串、列表、元组都属于可迭代对象,并不是迭代器!
        • 可以使用type查看列表和迭代器类型的不同:
        • pass
          
    • 如何创建一个迭代器呢?
      • 字符串,列表或元组对象,甚至自定义对象都可用于创建迭代器:
      • #使用Python内置的iter()方法创建迭代器对象
        from collections import Iterable #Iterable迭代类型
        
        alist = [1,2,3]
        print(type(alist))
        
        #将列表转换成迭代器对象
        iter_alist = iter(alist)
        print(type(iter_alist))
        
    • 使用next()方法获取迭代器的下一个元素:
    • from collections import Iterable #Iterable迭代类型
      
      alist = [1,2,3]
      #将列表转换成迭代器对象
      iter_alist = iter(alist)
      print(next(iter_alist))
      print(next(iter_alist))
      print(next(iter_alist))
      
      
      
      • 使用for循环遍历迭代器:
    • from collections import Iterable #Iterable迭代类型
      
      alist = [1,2,3]
      #将列表转换成迭代器对象
      iter_alist = iter(alist)
      for item in iter_alist:
          print(item)
      
      
  • 思考:迭代器的作用是什么?
    • 可迭代对象的优缺点:
      • 可迭代对象的优点:可以直观查看里面的对象,如直接查看列表的内容
      • 可迭代对象缺点:全部内容要加载至内存中,故占用内存
    • 迭代对象的优缺点:
      • 优点:
        • 提供了一种通用不依赖索引的迭代取值方式;
        • 节省内存,迭代器在内存中相当于只占一个数据的空间:因为每次取值上一条数据会在内存释放,加载当前的此条数据。
      • 缺点:
        • 因为有next方法,即只能往后取值,不能往前,取值不如按照索引的方式灵活,不能取指定的某一个值
        • 无法预测迭代器的长度
  • 总结:迭代器和可迭代的区别?
    1. 凡是可作用于for循环的对象都是可迭代类型;
    2. 凡是可作用于next()函数的对象都是迭代器类型;
    3. list、dict、str等是可迭代的但不是迭代器,因为next()函数无法调用它们。可以通过iter()函数将它们转换成迭代器。
  • 自定义迭代器

    • 很多时候,为了让我们自己写的类成为一个迭代器,需要在类里实现__iter__()__next__()方法
      • 实际上,在使用next()函数的时候,调用的就是迭代器对象的__next__方法
      • python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器。
        • 迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可
    • #迭代生成指定范围数列的平方值
      class IterObj():
          #start和end规定了数列的范围(start-end)
          def __init__(self,start,end):
              self.start = start
              self.end = end
              self.index = 1#记录__next__被调用的次数
          #直接返回迭代器对象即可
          def __iter__(self):
              return self
          #在类的外部调用next函数,实际就是在执行迭代器对象的__next__方法
          def __next__(self):
              if self.index > self.end:
                  raise StopIteration
              value = self.index ** 2
              self.index += 1
              return value
      
      obj = IterObj(1,50000) #(1-5)
      for item in obj:
      print(item)
      
    • 菲波那切数列实现

    • class IterObj():
          def __init__(self,count):
              self.count = count
              self.index = 0 #记录生成了第几个元素
      
              self.num1 = 0
              self.num2 = 1
              self.num3 = 1
      
          def __iter__(self):
              return self
          def __next__(self):
              if self.index >= self.count:
                  raise StopIteration
              value = self.num1
              self.index += 1
              self.num1,self.num2,self.num3 = self.num2,self.num3,self.num2+self.num3
              return value
      
      
      obj = IterObj(10)
      for i in obj:
          print(i)
      #0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584
      
    • 实现类似iter功能的类:可以使得将列表转换成迭代器
    • class IterObj():
          #start和end规定了数列的范围(start-end)
          def __init__(self,alist):
              self.alist = alist
              self.index = 0
      
          def __iter__(self):
              return self
          def __next__(self):
              if self.index >= len(self.alist):
                  raise StopIteration
              value = self.alist[self.index]
              self.index += 1
              return value
      
      alist = [1,2,3,4,5]
      obj = IterObj(alist) #iter(alist)
      for item in obj:
          print(item)
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值