• Python -- 生成器


    如果列表元素可以按照某种算法推算出来,那么我们不必创建完整的list,从而节省大量的空间。

    在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

    >>> L = [x * x for x in range(10)]
    >>> L
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x104feab40>

    L为列表推导式生成的列表

    g为生成器,可以通过next(g)的方式调用,有更多的元素时,抛出StopIteration的错误。

    也可以通过for i in g:的方式循环调用

    输出型


    def fib():
        a, b = 0, 1while b < 100:
            yield b
            a, b = b, a+b
    
    a = fib()    #此时,a就是一个生成器

    for i in a:
      print(i)

    函数中,遇到yield就会中断,下次又继续执行,直到没有yield语句可以执行时,抛出异常。

    接收输入型


    def reciver():
        while True:
            n = (yield)
            print("Got %s" % n)
    r
    = reciver() next(r) r.send(1) r.send('2')


    输入输出型


    def get():
        n = 0
        result = None
        while True:
            n = (yield result)
            result = n*10
    
    t = get()
    next(t)
    for i in range(10):
        print(t.send(str(i)))
    t.close()

    传递参数


    def countdown(n):
        print("counting down from %d" % n)
        while n > 0:
            yield n
            n -= 1
    
    
    c = countdown(10)
    print next(c)
    print next(c)
    
    for i in countdown(10):
        print(i)print sum(countdown(10))
    要先执行next()函数,然后才能发送数据,如果忘记的话就会报错。

    这怎么办?用装饰器来自动执行:
    def coroutine(func):
        def start(*args,**kwargs):
            g = func(*args,**kwargs)
            next(g)
            return g
        return start
    
    @coroutine
    def reciver():
        while True:
            n = (yield)
            print "Got %s" % n
    
    r = reciver()
    r.send(1)
    r.send('2')
    KEEP LEARNING!
  • 相关阅读:
    配置vCenter Server Appliance 6.7
    部署vCenter Server Appliance 6.7
    罗克韦尔 Allen-Bradley MicroLogix 1400 查看、设置IP
    centos7 部署 docker compose
    centos7 部署 docker ce
    docker 定时清理none镜像
    [CLR via C#]5.1 基元类型
    [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
    [CLR via C#]1.6 Framework类库~1.9与非托管代码的互操作性
    [CLR via C#]1.5 本地代码生成器:NGen.exe
  • 原文地址:https://www.cnblogs.com/roronoa-sqd/p/4899433.html
Copyright © 2020-2023  润新知