欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么使用python生成器中的send()和next()-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站制作、成都做網(wǎng)站與策劃設(shè)計(jì),萊西網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:萊西等地區(qū)。萊西做網(wǎng)站價(jià)格咨詢:18980820575

這篇文章將為大家詳細(xì)講解有關(guān)怎么使用python生成器中的send()和next(),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

在異步IO的使用時(shí),generator是最基本的一個(gè)實(shí)現(xiàn)方法。python生成器有兩個(gè)主要方法,一個(gè)是send一個(gè)是next。今天我們來看看兩者的用法和聯(lián)系。在每段代碼中,第一個(gè)next調(diào)用,相當(dāng)于啟動(dòng)生成器,會(huì)從生成器函數(shù)的第一行代碼開始執(zhí)行,直到第一次執(zhí)行完yield語句(第4行)后,跳出生成器函數(shù)。然后第二個(gè)next調(diào)用,進(jìn)入生成器函數(shù)后,從yield語句的下一句語句(第5行)開始執(zhí)行,然后重新運(yùn)行到y(tǒng)ield語句,執(zhí)行后,跳出生成器函數(shù)后面再次調(diào)用next,依次類推。

這里我們用經(jīng)典的生產(chǎn)者-消費(fèi)者模型舉個(gè)例子(摘自廖雪峰的博客)

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()

實(shí)際上next()和send()在一定意義上作用是相似的,區(qū)別是send()可以傳遞yield表達(dá)式的值進(jìn)去,而next()不能傳遞特定的值,只能傳遞None進(jìn)去。因此,我們可以看做c.next() 和 c.send(None) 作用是一樣的。

第一次調(diào)用時(shí),請(qǐng)使用next()語句或是send(None),不能使用send發(fā)送一個(gè)非None的值,否則會(huì)出錯(cuò)的,因?yàn)闆]有Python yield語句來接收這個(gè)值。

下面說明下send執(zhí)行的順序。先記住,n1 = yield r這句話是從右往左執(zhí)行的。當(dāng)?shù)谝淮蝧end(None)(對(duì)應(yīng)11行)時(shí),啟動(dòng)生成器,從生成器函數(shù)的第一行代碼開始執(zhí)行,直到第一次執(zhí)行完yield(對(duì)應(yīng)第4行)后,跳出生成器函數(shù)。這個(gè)過程中,n1一直沒有定義。

運(yùn)行到send(1)時(shí),進(jìn)入生成器函數(shù),此時(shí),將yield r看做一個(gè)整體,賦值給它并且傳回。此時(shí)即相當(dāng)于把1賦值給n1,但是并不執(zhí)行yield部分。下面繼續(xù)從yield的下一語句繼續(xù)執(zhí)行,然后重新運(yùn)行到y(tǒng)ield語句,執(zhí)行后,跳出生成器函數(shù)。即send和next相比,只是開始多了一次賦值的動(dòng)作,其他運(yùn)行流程是相同的。

def consumer():
    r = 'here'
    while True:
        n1 = yield r   #這里的等式右邊相當(dāng)于一個(gè)整體,接受回傳值
        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)

運(yùn)行結(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)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

當(dāng)前名稱:怎么使用python生成器中的send()和next()-創(chuàng)新互聯(lián)
URL分享:http://chinadenli.net/article30/dhjhpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、品牌網(wǎng)站制作、微信公眾號(hào)、軟件開發(fā)、網(wǎng)站收錄、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司