python 迭代器与生成器

1:首先要明确的几个概念

  1.1:什么是迭代?

    个人理解迭代就是从集合中取出(访问)数据的过程,而这种取出(访问)从首到尾单向进行的,也就是说在一次迭代过程中,每一个数据只被取出(访问)一次。

  1.2:什么是迭代器?

    迭代器的出现必定是解决一些问题,所以首先要明确是什么问题,请看下面代码

    

    for i in range(1000): pass

    在上面的这个for循环中,是产生一个长度为一千的list,但是如果长度更长呢?明显会占据很大的内存空间,影响效率。

    而迭代器的出现就是为了解决这样的问题,例如上述的问题可以这样解决

     for i in xrange(1000): pass

    xrange返回一个迭代器对象,整个for循环过程可以这样理解,先请求一次迭代器对象,执行对象中的next()方法,返回值赋予i,然后再次请求...

  1.3:什么是迭代器对象?

    个人理解:当一个类实现了__iter__()与next()时,那么该类的实例对象都可以看做是一个迭代器对象

    

  class Fabs(object):
      def __init__(self,max):
          self.max = max
          self.n = 1
          self.a,self.b = 0,1

      def __iter__(self):
          return self

      def next(self):
          if self.n <= self.max:
              self.result = self.b
              self.a,self.b = self.b,self.a+self.b
              self.n += 1
              return self.result
          raise StopIteration               

    类Fabs的实例对象就是一个迭代器对象:

    for key in Fabs(5):
        print key

    

    1.4:什么是生成器?

      同样我们先要弄清楚生成器为什么要出现?

      明显的,我们上述定义的迭代器虽然解决了内存占用的问题,可是整个迭代器显得代码过长,不简洁,而生成器即能够帮助我们解决内存问题,又能够实现代码的整洁

      

      def createGenerator():
         n,a,b = 1,0,1
         while n <= max:
            yield b
            a,b = b,a+b
            n += 1
      mygenerator = createGenerator()
      for i in mygenerator:
           print i

  

 

      由于方法中有yield关键字存在,因此python解释器在调用方法时,并不会执行方法,而是返回一个生成器对象,

      这个生成器对象同样也有next()与__iter__()

      在for循环中,它的执行过程是这样的,“请求”生成器,执行函数至yield处,然后返回yield处的值赋予i并停止执行,再次“请求”,然后从上次yield处停止执行的地方再次执行...,当在一次请求执行过程中没有遇到yield关键字,则抛出StopIteration 异常。【for循环能够识别StopIteration,认为是迭代结束 】

 

 

2:小结

  2.1:迭代器的出现是为了解决迭代过程中内存过量占用的问题,生成器的出现是解决迭代器代码繁琐的问题

  2.2:迭代器与生成器都是一个概念、统称,而我们平常使用的是迭代器对象【通常就称为迭代器】与生成器对象【通常就称为生成器】

  2.3:迭代器与生成器区别:

    迭代器是一个类对象,实现了next()与__iter__(),然后解决了内存过量占用的问题,这个类使我们自己定义的

    同样,生成器也是个类对象,实现了next()与__iter__(),然后解决了内存过量占用的问题,但是这个类不是我们自己定义的,

    生成器是通过在一个函数中添加yield关键字,然后调用方法会返回一个生成器对象

  

 

posted @ 2017-04-21 16:48  fs阿杰  阅读(137)  评论(0)    收藏  举报