python中generator;对yield的理解

最近学到python的协程的时候,对于yield就是没理解清楚,后来查到资料之后明白了,定义函数里面有yield语句则就是g=callable()就成为了一个generator,其实yield就类似于return语句,暂停执行并返回值,当generator调用这个值之后,它就没有这个值了,具体可以参考https://blog.csdn.net/mieleizhi0522/article/details/82142856

 第一次执行next(g)的时候,程序顺序执行到yield并返回此时yield的值,第二次调用next(g),yield的值已经被第一次next使用,所以没有了。然后从刚刚断的地方继续执行下去,如果yield是套在循环里面的,剩下的yield都只会在循环里走,除非有代码跳出循环。另外,如果出现   

y = yield x

之类的赋值语句,要记得是先yield返回当前结果,调用下一次next的时候再进行赋值操作,然后运行下。

个人理解:next()之后yield的值已经被使用了,不存在了。所以这个时候的赋值是空的 ,可以在下面打印print('y:',y)能看到y:None。对于generator还有一种调用是send,     g.send(value)这样调用的时候也是运行到send返回。但是在下一次使用的时候,yield的值不是None而是传进来的value,注意:第一次send只能传None,因为第一次,没有yield来接参数,最简单的例子可以看看协程的消费者和生产者问题

def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return
        print('[CONSUMER] Consuming %s...' % n)
        r = '200 OK'

def produce(c):
    c.send(None)
    n = 0
    while n < 5:
        n = n + 1
        print('[PRODUCER] Producing %s...' % n)
        r = c.send(n)
        print('[PRODUCER] Consumer return: %s' % r)
    c.close()

c = consumer()
produce(c)

猜你喜欢

转载自www.cnblogs.com/pason-blog/p/10687021.html