創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站制作、成都做網(wǎng)站與策劃設(shè)計,萊西網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:萊西等地區(qū)。萊西做網(wǎng)站價格咨詢:18980820575這篇文章將為大家詳細(xì)講解有關(guān)怎么使用python生成器中的send()和next(),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
在異步IO的使用時,generator是最基本的一個實現(xiàn)方法。python生成器有兩個主要方法,一個是send一個是next。今天我們來看看兩者的用法和聯(lián)系。在每段代碼中,第一個next調(diào)用,相當(dāng)于啟動生成器,會從生成器函數(shù)的第一行代碼開始執(zhí)行,直到第一次執(zhí)行完yield語句(第4行)后,跳出生成器函數(shù)。然后第二個next調(diào)用,進(jìn)入生成器函數(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表達(dá)式的值進(jìn)去,而next()不能傳遞特定的值,只能傳遞None進(jìn)去。因此,我們可以看做c.next() 和 c.send(None) 作用是一樣的。
第一次調(diào)用時,請使用next()語句或是send(None),不能使用send發(fā)送一個非None的值,否則會出錯的,因為沒有Python yield語句來接收這個值。
下面說明下send執(zhí)行的順序。先記住,n1 = yield r這句話是從右往左執(zhí)行的。當(dāng)?shù)谝淮蝧end(None)(對應(yīng)11行)時,啟動生成器,從生成器函數(shù)的第一行代碼開始執(zhí)行,直到第一次執(zhí)行完yield(對應(yīng)第4行)后,跳出生成器函數(shù)。這個過程中,n1一直沒有定義。
運行到send(1)時,進(jìn)入生成器函數(shù),此時,將yield r看做一個整體,賦值給它并且傳回。此時即相當(dāng)于把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 #這里的等式右邊相當(dāng)于一個整體,接受回傳值 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)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。