zoukankan      html  css  js  c++  java
  • 什么是生成器?

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

  • 相关阅读:
    Linux模拟网络延迟、丢包等
    TestLink汉化操作
    onems设备管理系统(TR-069和OMA)
    Installation Guide Ubuntu 16.04
    Configure GenieACS
    Linux下的tar压缩解压缩命令详解
    genieacs Installation on Ubuntu14.04
    Pyqt中富文本编辑器
    安装MongoDB
    到底什么是贝叶斯?
  • 原文地址:https://www.cnblogs.com/lyzfp/p/11440813.html
Copyright © 2011-2022 走看看