【前言】
我们可以通过列表生成式直接创建一个列表,但是受内存限制,列表的容量肯定是有限的。而且如果创建一个包含1000万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那么我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的内存空间。在python中这种一边循环一边计算的机制,称为生成器(Generator)。
所以说生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并么有把所有的值都存在内存中,而是在运行时生成值。
【生成器】
在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
生成器是一种数据类型,这种数据类型自动实现迭代器协议(其他数据类型需要调用自己的__iter__方法),所以生成器就是可迭代对象,生成器在python中有两种不同的表达方式:
1. 生成器函数
常规函数的定义,但是使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数状态,以便下次从它离开的地方继续执行。
例如使用yi