python yield 理解

1、当python的函数中出现yield,那么该函数就不是一个普通函数,而是一个生成器generator。

2、生成器generator是一种迭代器iterator,像list、tuple一样是可迭代的。

3、第一次调用带yield 的generator function,必须先使用next()或send(None)

4、yield是一个类似return的关键字,迭代一次遇见yield就返回yield后面的值。下一次迭代时,从上一次遇见yield后面的代码开始执行。

5、yield不断可以返回一个值,还能调用接收者发送的参数。


下面以缪雪峰官网例子,修改后做测试:点击打开链接

def consumer():
    r = 3
    while True:
        print(r)
        n = yield (r+1)
        if not n:
            return
        print('[CONSUMER] Consuming %s...' %(2*n))
        r = 9

def produce(c):
    m = c.send(None)
    print(m)
    print('hello')
    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)

执行结果如下图所示:

理解:

1、执行

m = c.send(None)

进入consumer() --> print(r )--> 返回yield后面的r+1,赋值给m

2、在produce(c)的while循环中,例如第一个n=0

n = n + 1 --> print('[PRODUCER] Producing %s...' % n) --> r = c.send(n)

执行到r = c.send(n),n=1,直接进入到consumer()中的yield部分,将1传递给consumer()中的yield后面的(r+1),此时consumer()中的n=1。在consumer()中,执行print('[CONSUMER] Consuming %s...' %(2*n)), r = 9,while循环,print(r),直到下一个yield,并将yield后面的r+1返回给produce(c)中的r。

3、produce(c)中循环结束,结束consumer(),用c.close()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值