1. 程式人生 > >理解Python的yield與send()語句

理解Python的yield與send()語句

在generator中,我們不但可以通過for迴圈來迭代,還可以不斷呼叫next()函式獲取由yield語句返回的下一個值。

但是Python的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) # 一旦n有值,則切換到consumer執行
        print('[PRODUCER] Consumer return: %s'%r)
    c.close() # 關閉生成器


c = consumer()
produce(c)

consumer()函式其實就是一個簡單的生成器了,我們都知道生成器是需要next()來觸發的,但是在這邊我們不用next()了,我們用生成器的send()方法

next()跟send()不同的地方是,next()只能以None作為引數傳遞,而send()可以傳遞yield的值。

所以 n = yield r 可以理解為yield在傳送n的同時也在接收r值,通過produce(c)呼叫後,一旦有n值,則切換到 consumer去執行。執行完了後生成器關閉。