您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么使用python生成器中的send()和next(),文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
在異步IO的使用時,generator是最基本的一個實現方法。python生成器有兩個主要方法,一個是send一個是next。今天我們來看看兩者的用法和聯系。在每段代碼中,第一個next調用,相當于啟動生成器,會從生成器函數的第一行代碼開始執行,直到第一次執行完yield語句(第4行)后,跳出生成器函數。然后第二個next調用,進入生成器函數后,從yield語句的下一句語句(第5行)開始執行,然后重新運行到yield語句,執行后,跳出生成器函數后面再次調用next,依次類推。
這里我們用經典的生產者-消費者模型舉個例子(摘自廖雪峰的博客)
def consumer(): r = 0 for i in xrange(3): yield r r = '200 OK'+ str(i) c = consumer() n1 = c.next() n2 = c.next() n3 = c.next()
實際上next()和send()在一定意義上作用是相似的,區別是send()可以傳遞yield表達式的值進去,而next()不能傳遞特定的值,只能傳遞None進去。因此,我們可以看做c.next() 和 c.send(None) 作用是一樣的。
第一次調用時,請使用next()語句或是send(None),不能使用send發送一個非None的值,否則會出錯的,因為沒有Python yield語句來接收這個值。
下面說明下send執行的順序。先記住,n1 = yield r這句話是從右往左執行的。當第一次send(None)(對應11行)時,啟動生成器,從生成器函數的第一行代碼開始執行,直到第一次執行完yield(對應第4行)后,跳出生成器函數。這個過程中,n1一直沒有定義。
運行到send(1)時,進入生成器函數,此時,將yield r看做一個整體,賦值給它并且傳回。此時即相當于把1賦值給n1,但是并不執行yield部分。下面繼續從yield的下一語句繼續執行,然后重新運行到yield語句,執行后,跳出生成器函數。即send和next相比,只是開始多了一次賦值的動作,其他運行流程是相同的。
def consumer(): r = 'here' while True: n1 = yield r #這里的等式右邊相當于一個整體,接受回傳值 if not n1: return print('[CONSUMER] Consuming %s...' % n1) r = '%d00 OK' % 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)
運行結果:
[PRODUCER] Producing 1... [CONSUMER] Consuming 1... [PRODUCER] Consumer return: 100 OK [PRODUCER] Producing 2... [CONSUMER] Consuming 2... [PRODUCER] Consumer return: 200 OK [PRODUCER] Producing 3... [CONSUMER] Consuming 3... [PRODUCER] Consumer return: 300 OK [PRODUCER] Producing 4... [CONSUMER] Consuming 4... [PRODUCER] Consumer return: 400 OK [PRODUCER] Producing 5... [CONSUMER] Consuming 5... [PRODUCER] Consumer return: 500 OK
關于怎么使用python生成器中的send()和next()就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。