Python内置了很多非常有用的数据结构,比如列表(list)、集合(set)以及字典(dictionary)。这些数据结构方便了开发人员,特别是通过列表生成式,可以很方便的创建一个列表。但是,毕竟内存有限,列表的容量肯定会受到限制。当列表数据量大到我们开始担心系统内存空间时,就应该考虑使用生成器进行迭代了。
在Python中,生成器实际上是一个存在于堆上的函数。这个函数可以在循环过程中不断推算出后续的元素,直到产生特殊异常StopIteration结束。
如何创建一个生成器?
-
把列表生成式[]修改为()
>>> normal_list = [val for val in range(5)] >>> type(normal_list) <type 'list'> >>> normal_list [0, 1, 2, 3, 4] >>> generator_obj = (val for val in range(5)) >>> type(generator_obj) <type 'generator'> >>> next(generator_obj) 0 >>> next(generator_obj) 1 >>> next(generator_obj) 2 >>> next(generator_obj) 3 >>> next(generator_obj) 4 >>> next(generator_obj) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
通过type方法进行测试可知,()可以把列表转化为生成器。如果要遍历生成器,可以使用next方法。直到生成器无法提供元素时,就会抛出StopIteration异常。
当然在实际编码过程中,使用最多的方式是使用for关键字完成生成器的迭代。
>>> for val in generator_obj: ... print val ... 0 1 2 3 4
-
使用关键字yield,把普通函数转化为生成器
def crange(begin,end,step=1): x = begin while x < end: yield x x += step >>> for n in crange(1,3,0.5): print n >>> for n in crange(1,3,0.5): ... print n ... 1 1.5 2.0 2.5
函数中只要出现了yield语句,就会被转变成一个生成器。与普通函数不同,生成器只会在响应迭代过程中的next时才会运行。一旦生成器函数返回,迭代就会停止。
-
小结
Python中的yeild关键字或者()均可以用来创建生成器函数。生成器函数通过在堆中保存算法的方式生成结果,在大数据量的迭代过程中可极大减少内存消耗。
如果对云计算感兴趣,可以关注我的微信公众号: