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

  • 相关阅读:
    Keil 4 与 J-Link 8 连接配置
    嵌入式之认识内存
    Windows10光驱位硬盘不识别
    无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-l1-1-0.dll上
    博客一夜回到解放前
    电动汽车-电池
    STM32书集选择
    嵌入式—学习嵌入式系统需具备的条件、方法及步骤
    Modbus抄表中应用到CRC8+CRC16+CRC32源码
    USART输出乱码3F,RS485抄表
  • 原文地址:https://www.cnblogs.com/lyzfp/p/11440813.html
Copyright © 2011-2022 走看看