• Python学习之路:生成器


    列别生成式:使代码更简洁

    >>> [i*2 for i in range(10)]
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    

     生成器是为了节省内存空间,生成器在调用的时候才会生成相应的数据,不调用的时候只是分配内存;

    只有一个__next__()方法。2.7里是next()

    生成器不可用切片的方式取;

    >>> b =( i*2 for i in range(10))
    >>> b
    <generator object <genexpr> at 0x103e5dd00>
    
    >>> b.__next__()
    0
    >>> b.__next__()
    2
    >>> b.__next__()
    4
    

     generator非常强大,如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

    Fibonacci数列:

    def fib(max):
        n,a,b=0,0,1
        while n < max:
            print(b)
            a,b=b,a+b
            n=n+1
        return 'done'
    
    fib(10)
    

     函数生成式及异常信息提醒def fib(max)    n,a,b=0,0,1

        while n < max:
            #print(b)
            yield b #转换成生成器
            a,b=b,a+b
            n=n+1
        return 'done'#如果下面程序中next超过max范围,会报错,提示异常
    
    f=fib(100)
    print(f.__next__())
    print("========")#可以让函数中断,之后继续
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    
    print("=====start loop ======")
    for i in f:
        print(i)
    
    #抓住异常
    g=fib(6)
    while True:
        try:
            x=g.__next__()
            print('g:',x)
        except StopIteration as e:
        print('Generator return value:',e.value)
        break
  • 相关阅读:
    [转]C#获取文件的MD5值
    跨域ajax返回
    根据子表的条件修改主表的数据
    网络与多线程的设计例子
    网络与多线程的设计模式
    tcpdump移植和使用 -- by Johnson
    关于程序的歪门邪说--by Johnson
    重装系统——联想window 10
    Qt项目中error: C2001: newline in constant错误的解决
    使用NSIS制作Windows安装程序快速入门
  • 原文地址:https://www.cnblogs.com/xiaobai005/p/7966583.html
Copyright © 2020-2023  润新知