91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用python生成器中的send()和next()

發布時間:2020-08-25 14:15:45 來源:億速云 閱讀:245 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關怎么使用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()就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳春市| 华容县| 上林县| 新野县| 白朗县| 岗巴县| 调兵山市| 巍山| 斗六市| 西丰县| 清水河县| 吉安市| 论坛| 栾城县| 军事| 子洲县| 莱芜市| 定陶县| 塘沽区| 达日县| 南康市| 东源县| 宜州市| 旅游| 新乡市| 常山县| 邹城市| 沙洋县| 长白| 依兰县| 德清县| 柞水县| 临潭县| 盐津县| 双桥区| 凌海市| 远安县| 金乡县| 宁蒗| 巴塘县| 牙克石市|