一、生成器的定义
在函数中使用yield关键字,由函数返回的结果就是生成器。
1 def gen(): 2 print('gen') 3 print('gen') 4 yield 0 5 print('gen') 6 yield 1 7 print('gen') 8 yield 2 9 g = gen() 10 print(g) 11 print(next(g)) 12 print(g.__next__())
执行结果:
<generator object gen at 0x106ccfcf0>
gen
gen
0
gen
1
从上面的例子可以看出,
一、生成器是迭代器,next(g),g.__next__()取值照样可用。
二、yield关键字的作用可以保留生成器的状态。
三、从第二次迭代开始,每一次迭代会从上一次迭代返回结果的位置开始往下执行代码,遇到yield后返回迭代结果并保留生成器状态再退出。
二、使用生成器有什么好处
用例子来说明一下,
第一种情况:假设需要生成一百万个数据,我们可以通过循环来生成一百万个数据,然后存放于集合中。那么这个集合所占用的内存空间就非常大了。这种情况会一下子让程序崩溃。而且没办法做到获取数据的时效性,等到一百万个数据生成完毕,才可以取出数据。
第二种情况:假设同样生成一百万个数据,我们使用生成器来生成,我们已经明白生成器的定义和使用,生成器在使用的过程中,当需要迭代数据时,生成器就帮我们取出结果数据,每次迭代每次取出一个结果数据存放到变量中,变量使用过后,系统可以自动回收,可以很好地节省内存开支。并且可以做到获取数据的时效性。
在本人看来,使用生成器在程序需要处理或者生成大量数据时,可以极大地节省内存空间,在性能上有所保证,基于这点好处使用生成器才真正发挥它的强大作用。