通过列表生成式,我们可以直接创建一个列表。
就是[x * x for x in [1, 2, 3]]这样的列表生成式。
但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
例如上边的列表生成式改变:
g = (x * x for x in [1, 2, 3])
generator保存的是算法(并不是已经计算出来的整个list,因此不会一下占用很大的空间),每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
每次调用next很麻烦。因此:
这是一个简单的办法。(就是直接for生成器)
如果把print换成yield,也就是并不是每一轮都打印出来。
如下,
它就变成了一个生成器。
就是一个计算方式,并没有进行每一轮的计算。
生成器中只是保存了这种计算方式。
还是用for的方式遍历它,
会得到正确的结果。
生成器每调用一次就执行到yield停止。
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
小结:
- 列表生成式的[]变成()就是生成器
- 包含yield的函数就是生成器
课后作业:使用生成器实现杨辉三角
我的实现:
来源:廖雪峰python3教程