您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python生成器

5b51 2022/1/14 8:24:26 python 字数 5223 阅读 668 来源 www.jb51.cc/python

什么是生成器 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后

概述

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

要创建一个生成器,有很多种方法

第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( )

L = [ x*2 for x in range(5)]

print(L)

结果

[0,2,4,6,8]

将[]改成()

G = ( x*2 for x in range(5))

结果

 
   at 0x7f626c132db0>
 

怎么打印出生成器的每一个元素呢?如果要一个一个打印出来,可以通过 next() 函数获得生成器的下一个返回值

生成器保存的是算法,每次调用 next(G) ,就计算出 G 的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的异常。当然,这种不断调用 next() 实在是太变态了,正确的方法是使用 for 循环,因为生成器也是可迭代对象。所以,我们创建了一个生成器后,基本上永远不会调用 next() ,而是通过 for 循环来迭代它,并且不需要关心 StopIteration 异常。

第二种方法

def fib(times):

  n = 0

  while n

    yield n

    n += 1

for i in fib(10):

  print(i)

结果:

0

1

2

3

4

5

6

7

8

9

生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。

生成器的特点:

节约内存

迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

总结

以上是编程之家为你收集整理的Python生成器全部内容,希望文章能够帮你解决Python生成器所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶