什么是生成器?

在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 就是返回当前生成器指针所指的值。

 

posted @ 2019-08-31 22:33  奔腾的小河  阅读(794)  评论(0编辑  收藏  举报