在如何理解Python可迭代对象、迭代器和生成器中尝试描述了生成器和迭代器的一些理解,这里主要想说说对生成器的一些见解,希望能解释的清楚。
1 什么是生成器
很难从文字上讲清楚抽象概念,从特征上来谈谈吧:使用了 yield 的函数被称为生成器(generator),所以生成器就是一个含有 yield 关键字的函数,这种函数没有返回值,或者说我们用一个变量接收生成器的返回值时只能得到这个对象,而不是其返回值,也无法调用这个函数。
但是我们可以通过next()方法来调用这个函数,并且它存在__next__方法
由此可见生成器生成了什么,没错,生成器生成了一个迭代器,或者说生成器就是一种特殊的迭代器。实际上,生成器只能在迭代中使用。
2 生成器的工作原理
1、 yield关键字使得一个函数变为一个生成器;
2、 调用函数时,运行到yield会返回结果,并记录运行的状态,挂起函数(并没有结束函数的运行);
3、 再次调用函数时,会从yiel处继续运行,直到运行结束。
3 如何创建生成器
生成器的创建有两种方法:
1、使用yield关键字(既然含有yield的函数是生成器,当然是用yield来创建生成器啦)
2、 使用生成器推导式
4 生成器的意义
生成器的一个重要意义就是节省内存。生成器是边运行边运算,迭代到相应的位置才把对应的结果记录到内存中,相比于直接把全部结果保存到可迭代对象(如列表)中再迭代,肯定是更省内存的(当然如果数据量小的情况下是没有太多差异的)。
我们可以通过比较下面的测试代码来感受两种方式对内存的占用情况:
可以看出使用列表保存数据时,直接在内存中使用了4.6M空间来存储列表;但是使用生成器时,没有占用内存空间。
5 总结
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。