python3系列:生成器

通过列表生成式,我们可以直接创建一个列表。
就是[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

扫描二维码关注公众号,回复: 879265 查看本文章

小结:

  • 列表生成式的[]变成()就是生成器
  • 包含yield的函数就是生成器

课后作业:使用生成器实现杨辉三角

我的实现:


来源:廖雪峰python3教程

猜你喜欢

转载自blog.csdn.net/yinruiyang94/article/details/79315574