python3基础之生成器

    初识生成器

    说到生成器还是要从列表推导式说起,关于列表推导式可以看看《python3基础之如何使用列表推导式》。先看一个简单的列表推导式:

    image.png

    可以看到列表推导式是用中括号将式子括起来的,如果把中括号改成小括号,那它就变成一个生成器了:

    image.png

    按照推导式的理论,看这式子的结构我还以为list2是一个元组推导式呢。看来python里应该没有元组推导式了。现在已经知道生成器长什么样了,那生成器又有什么用呢?写个例子测试一下吧:

    image.png

    这么看生成器和列表好像是一样的,那要生成器干什么呢?实际上生成器像是保存了一套算法的一个对象,刚开始的时候并它没有实际的值,只有在使用时才去生成。也就是说到第二for执行之前list2里并没有2和3这两个值。而列表推导式会先计算出所有的元素,也就是说list1在第一个for执行之前已经存在2和3这两个值了。为了验证这点写个例子测试一下:

   image.png

   为了看到效果,我们将列表推导式和生成器的range改为了200000.程序运行时看到list2直接打印出来了,而list1要经过十几秒才打印出来(生成列表花费了十几秒)。经过这么比较生成器的优势就体现出来了,对于列表内的元素数量较大的情况下,生成器可以减少内存。而对于列表中存在耗时操作的对象时,生成器又能提高运行效率(因为它生成一个就能先用一个)。

    

    函数生成器    

    上面那种生成器是通过一个表达式来表示的,如果逻辑需要很复杂的话,用式子就不好表示了。这时候可以用函数的方式来创建生成器。函数创建生成器的形式又是怎样的呢?举个例子:

    image.png

    函数中包含yield (e后面是小写的字母'L'),那么函数返回的就是一个生成器对象。 生成器也是一种可迭代对象,yield的作用就是返回一次迭代的值。我们通过next获取生成器的值:

image.png

 从例子中可以看到我们首先创建了一个生成器,第一次调用next获取了第一yield返回的值,第二次调用next获取的是第二个yield返回的值。它并不是整个函数直接返回一个结果,而是在使用时才生成数据。yield返回结果后好像暂停了一样,直到要获取生成器的下一个值时,再从刚才的yield后面继续运行。

    

演示站
上一篇:python3基础之如何使用字典和集合推导式
下一篇:python3基础之异常处理(通俗易懂)

发表评论