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关键字,然后调用方法会返回一个生成器对象
浙公网安备 33010602011771号