python2 生成器 yield next() send()之间的关系

转载自:http://www.javashuo.com/article/p-saympyae-gs.htmlpython

 

对于普通的生成器,第一个next调用,至关于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。函数

而后第二个next调用,进入生成器函数后,从yield语句的下一句语句(第5行)开始执行,而后从新运行到yield语句,执行后,跳出生成器函数,spa

后面再次调用next,依次类推。下面是一个列子:.net

def consumer():
    r = 'here'
    for i in xrange(3):
        yield r
        r = '200 OK'+ str(i)

c = consumer()
n1 = c.next()
n2 = c.next()
n3 = c.next()    

  

了解了next()如何让包含yield的函数执行后,咱们再来看另一个很是重要的函数send(msg)。其实next()和send()在必定意义上做用是类似的,区别是send()能够传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。所以,咱们能够看作c.next() 和 c.send(None) 做用是同样的。须要提醒的是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,不然会出错的,由于没有Python yield语句来接收这个值。
下面来着重说明下send执行的顺序。当第一次send(None)(对应11行)时,启动生成器,从生成器函数的第一行代码开始执行,直到第一次执行完yield(对应第4行)后,跳出生成器函数。这个过程当中,n1一直没有定义。
下面运行到send(1)时,进入生成器函数,注意这里与调用next的不一样。这里是从第4行开始执行,把1赋值给n1,可是并不执行yield部分。下面继续从yield的下一语句继续执行,而后从新运行到yield语句,执行后,跳出生成器函数。blog

即send和next相比,只是开始多了一次赋值的动做,其余运行流程是相同的。ci

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

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

  

运行结果:get

[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK1
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK2
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK3
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK4
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK5
---------------------
做者:pfm685757
来源:CSDN
原文:https://blog.csdn.net/pfm685757/article/details/49924099
版权声明:本文为博主原创文章,转载请附上博文连接!class

相关文章
相关标签/搜索