理解Python的yield與send()語句
阿新 • • 發佈:2019-01-31
在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去執行。執行完了後生成器關閉。