理解迭代器和可迭代对象

前言:

之前在迭代器、可迭代对象这一部分一直有些混淆,结合一些资料,表达我对这些概念的理解,未必都对,但是适合刚开始入手的朋友们从零开始理解。

开门见山首先介绍可迭代对象和迭代器的通俗理解

迭代器:
  就是能被next()调用得到下一次迭代值的对象,迭代器不直接保存迭代的序列值,而保存得到下一次迭代值的算法。

可迭代对象:
   就是能被iter()方法调用得到迭代器的对象,能进行for循环的必须是可迭代对象。

for循环的底层实现原理:
以下是一个for循环的格式

  for i in 可迭代对象:
    循环体

实质是调用内建方法iter()得到迭代器对象,然后通过每次调用next(迭代器)得到i的迭代值

例如以下的代码:

for i in x:
    print(i)

完全可以改写为:

iterator = iter(x)
while True:
    i = next(iterator)
    print(i)

从严格或者底层原理来说

迭代器或迭代器对象:实现了__next__()魔法方法的(类所实例化的)对象,该方法返回迭代器下一个值(保存得到下一个迭代值的算法)

可迭代对象:实现了__iter__()魔法方法的(类所实例化的)对象,该方法返回一个迭代器对象

实际上,next和iter是对__next__和__iter__的进一步封装或者说next和iter在执行的时候又分别调用了内部的__next__和__iter__从而实现迭代器和可迭代对象的特性和功能

综上,我们可以理解for循环、可迭代对象、迭代器三者的联系:

for循环只能对可迭代对象进行,可迭代对象又需要迭代器的实现

由此,我们可以自定义实现迭代器和可迭代迭代对象,从而实现自定义的for循环效果

示例:

通过迭代器和可迭代对象实现菲波那切数列
分别定义迭代器和可迭代对象所属的类:

class Fib:
  '''定义可迭代对象所属类'''
    def __init__(self,num): #num表示该数列的长度
      self.a = 1
      self.b = 2
     self.current=self.a
     self.num = num
    def __iter__(self):
        return FebIterator(self)
class FibIterator(self):
  '''定义迭代器类'''
    def __init__(self,source):
        self.source = source
    def __next__(self):
     
     if(self.num-1>=0):
       self.num = self.num-1
        self.current = self.a
        self.a = self.b
        self.b = self.b+self.current   #以上两步赋值操作可省略中间变量直接写为self.a,self.b = self.b,self.a+self,b 
       return self.curent
      else: raise StopIteration

通过调用这两个类的实例化对象,可以实现循环打印斐波那契数列

fib = Fib()

for i in fib:
    print(i)

实际上,为了简化和方便,完全可以在一个类中同时实现__iter__()和__next__()方法,也即该类实例化的对象既是一个可迭代对象也是迭代器,代码如下:

class Fib:
    def __init__():
        self.a = 1
        self.b = 2
     sele.current = self.a
    def __iter__(self):
        return self
    def __next__():
     if(self.num-1>=0):
       self.num = self.num-1
        self.current = self.a
        self.a = self.b
        self.b = self.b+self.current   #以上两步赋值操作可省略中间变量直接写为self.a,self.b = self.b,self.a+self,b 
       return self.curent
      else: raise StopIteration

其使用方法和之前没有区别,反而更加简便,前提是对迭代器和可迭代对象有清晰的理解和认识,否则会对二者概念产生混淆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值