码迷,mamicode.com
首页 > 其他好文 > 详细

什么是生成器?

时间:2019-08-31 23:37:18      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:app   而且   ext   访问   存在   一行代码   yield   生成式   数列   

在python中, 要产生一个列表,可以这样写:

a=[]  

for i in range(10):

  a.append(i*2)

但是,这样挺麻烦的,产生一个列表,需要三行语句。所以,有人就想到能不能一行代码来表示呢?其实,也是可以的,如下:

[ i*2 for i in range(10)]

当然,我们也可以写成[func(i) for i in range(10)]

1、这样,通过一个式子就能产生一个列表,我们把这样的式子叫做生成式

生成式通过算式可以产生符合要求的列表,这个列表是预先产生存在于内存中的,如果列表元素过多,例如100万,或1000万个,就占用特别多的内存,所以,具有一定的缺点。而生成器,占用的内存却是很少的。只要将上方的列表生成式外的方框改成圆括号就算是生成器了。

2、a=(i*2 for i in range(10))

这样产生的元组就是生成器。

生成器要满足三个特眯:

(1)生成器只有在调用时才会产生相应的数据。

(2)只记住当前的位置。

(3)只有一个方法,即__next__()

3、斐波那契数列。

def fib(max):

  n,a,b=0,0,1

  while n<max:

    #print(b)

    yield b

    a,b=b,a+b #这里相当于t=(b,a+b),a=t[0],b=t[1],和我们平常想的可能有一定的差距。

    n=n+1

  return(‘done‘)

注意:(敲黑板)只要将上方的print(b)改为yield b,此函数就变为了生成器。

变成生成器后有什么好处呢?

访问生成器fib(x)时,可以用__next__()方式随意进出,进出自由,而且读取里面的元素时不须等待时间。不象一次性生成的列表或元组。

yield b 就是返回当前生成器指针所指的值。

 

什么是生成器?

标签:app   而且   ext   访问   存在   一行代码   yield   生成式   数列   

原文地址:https://www.cnblogs.com/lyzfp/p/11440813.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!