這篇文章將為大家詳細講解有關(guān)怎么使用python生成器中的send()和next(),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
成都創(chuàng)新互聯(lián)公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務為基礎,以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!為您提供網(wǎng)站設計制作、成都做網(wǎng)站、成都網(wǎng)頁設計、小程序開發(fā)、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、重慶APP開發(fā)是成都本地專業(yè)的網(wǎng)站建設和網(wǎng)站設計公司,等你一起來見證!
在異步IO的使用時,generator是最基本的一個實現(xiàn)方法。python生成器有兩個主要方法,一個是send一個是next。今天我們來看看兩者的用法和聯(lián)系。在每段代碼中,第一個next調(diào)用,相當于啟動生成器,會從生成器函數(shù)的第一行代碼開始執(zhí)行,直到第一次執(zhí)行完yield語句(第4行)后,跳出生成器函數(shù)。然后第二個next調(diào)用,進入生成器函數(shù)后,從yield語句的下一句語句(第5行)開始執(zhí)行,然后重新運行到y(tǒng)ield語句,執(zhí)行后,跳出生成器函數(shù)后面再次調(diào)用next,依次類推。
這里我們用經(jīng)典的生產(chǎn)者-消費者模型舉個例子(摘自廖雪峰的博客)
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()在一定意義上作用是相似的,區(qū)別是send()可以傳遞yield表達式的值進去,而next()不能傳遞特定的值,只能傳遞None進去。因此,我們可以看做c.next() 和 c.send(None) 作用是一樣的。
第一次調(diào)用時,請使用next()語句或是send(None),不能使用send發(fā)送一個非None的值,否則會出錯的,因為沒有Python yield語句來接收這個值。
下面說明下send執(zhí)行的順序。先記住,n1 = yield r這句話是從右往左執(zhí)行的。當?shù)谝淮蝧end(None)(對應11行)時,啟動生成器,從生成器函數(shù)的第一行代碼開始執(zhí)行,直到第一次執(zhí)行完yield(對應第4行)后,跳出生成器函數(shù)。這個過程中,n1一直沒有定義。
運行到send(1)時,進入生成器函數(shù),此時,將yield r看做一個整體,賦值給它并且傳回。此時即相當于把1賦值給n1,但是并不執(zhí)行yield部分。下面繼續(xù)從yield的下一語句繼續(xù)執(zhí)行,然后重新運行到y(tǒng)ield語句,執(zhí)行后,跳出生成器函數(shù)。即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)
運行結(jié)果:
[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
關(guān)于怎么使用python生成器中的send()和next()就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
分享文章:怎么使用python生成器中的send()和next()
地址分享:http://jinyejixie.com/article8/ghheop.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、網(wǎng)站收錄、App設計、網(wǎng)站策劃、定制開發(fā)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)