Python語法 - yield表達式(相似 m = yield i )

 
yield是個表達式而不單單是個語句,因此可使用x = yield r 這樣的語法, yield表達式能夠接收send()發出的參數,yield表達式是跟send方法一塊兒配合使用
 
send方法
next()和send()在必定意義上做用是類似的,區別是send()能夠傳遞yield表達式的值進去,而next()不能傳遞特定的值,只能傳遞None進去。所以,咱們能夠看作c.next() 和 c.send(None) 做用是同樣的。

def gen():python

    value=0函數

    while True:spa

        receive = yield valuecode

        if receive=='e':協程

            breakci

        value = 'got: %s' % receivestring

 

g=gen()it

print(g.send(None))    io

print(g.send('aaa'))ast

print(g.send(3))

print(g.send('e'))

執行流程:

  1. 經過g.send(None)或者next(g)能夠啓動生成器函數,並執行到第一個yield語句結束的位置。此時,執行完了yield語句,可是沒有給receive賦值。yield value會輸出初始值0注意:在啓動生成器函數時只能send(None),若是試圖輸入其它的值都會獲得錯誤提示信息。
  2. 經過g.send(‘aaa’),會傳入aaa,並賦值給receive,而後計算出value的值,並回到while頭部,執行yield value語句有中止。此時yield value會輸出」got: aaa」,而後掛起。
  3. 經過g.send(3),會重複第2步,最後輸出結果爲」got: 3″
  4. 當咱們g.send(‘e’)時,程序會執行break而後推出循環,最後整個函數執行完畢,因此會獲得StopIteration異常。
執行結果:

0

got: aaa

got: 3

 

Traceback (most recent call last):

  File "C:\string.bak.py", line 20, in <module>

    print(g.send('e'))

StopIteration

 

yield表達式實現協程

def consumer(): r = 'yield' while True: #當下邊語句執行時,先執行yield r,而後consumer暫停,此時賦值運算還未進行 #等到producer調用send()時,send()的參數做爲yield r表達式的值賦給等號左邊 n = yield r #yield表達式能夠接收send()發出的參數 if not n: return print('[CONSUMER] Consuming %s...' % n) r = '200 OK' def produce(c): c.send(None) #send須要先調用send(None),由於只有生成器是暫停狀態才能夠接收send的參數 n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n) #調用consumer生成器 print('[PRODUCER] Consumer return: %s' % r) c.close() c = consumer() produce(c)
 
理解send()恢復生成器的過程
def gen(): a = yield 1 print('yield a % s' % a) b = yield 2 print('yield b % s' % b) c = yield 3 print('yield c % s' % c) r = gen() x = next(r) print('next x %s' % x) y = r.send(10) print('next y %s' %y) z = next(r) print('next z %s' % z) 

能夠看到實際上y=r.send(10) 的參數10是賦給了a。整個運行過程即執行x=next(r) 以後,gen()執行了yield 1 而後暫停,沒有進行對a的賦值。但再調用y=r.send(10) 時賦值過程繼續,並把10賦給了a.

相關文章
相關標籤/搜索