一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 淺談Python生成器generator之next和send的運行流程(詳解)

淺談Python生成器generator之next和send的運行流程(詳解)

2020-10-07 22:14Python教程網 Python

下面小編就為大家帶來一篇淺談Python生成器generator之next和send的運行流程(詳解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

對于普通的生成器,第一個next調用,相當于啟動生成器,會從生成器函數的第一行代碼開始執行,直到第一次執行完yield語句(第4行)后,跳出生成器函數。

然后第二個next調用,進入生成器函數后,從yield語句的下一句語句(第5行)開始執行,然后重新運行到yield語句,執行后,跳出生成器函數,后面再次調用next,依次類推。

下面是一個列子:

?
1
2
3
4
5
6
7
8
9
10
def consumer():
  r = 'here'
  for i in xrange(3):
    yield r
    r = '200 OK'+ str(i)
 
c = consumer()
n1 = c.next()
n2 = c.next()
n3 = c.next()

了解了next()如何讓包含yield的函數執行后,我們再來看另外一個非常重要的函數send(msg)。其實next()和send()在一定意義上作用是相似的,區別是send()可以傳遞yield表達式的值進去,而next()不能傳遞特定的值,只能傳遞None進去。因此,我們可以看做c.next() 和 c.send(None) 作用是一樣的。

需要提醒的是,第一次調用時,請使用next()語句或是send(None),不能使用send發送一個非None的值,否則會出錯的,因為沒有Python yield語句來接收這個值。

下面來著重說明下send執行的順序。當第一次send(None)(對應11行)時,啟動生成器,從生成器函數的第一行代碼開始執行,直到第一次執行完yield(對應第4行)后,跳出生成器函數。這個過程中,n1一直沒有定義。

下面運行到send(1)時,進入生成器函數,注意這里與調用next的不同。這里是從第4行開始執行,把1賦值給n1,但是并不執行yield部分。下面繼續從yield的下一語句繼續執行,然后重新運行到yield語句,執行后,跳出生成器函數。

即send和next相比,只是開始多了一次賦值的動作,其他運行流程是相同的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def consumer():
  r = 'here'
  while True:
    n1 = yield r
    if not n1:
      return
    print('[CONSUMER] Consuming %s...' % n1)
    r = '200 OK'+str(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)

 運行結果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[PRODUCER] Producing 1...
[CONSUMER] Consuming 1...
[PRODUCER] Consumer return: 200 OK1
[PRODUCER] Producing 2...
[CONSUMER] Consuming 2...
[PRODUCER] Consumer return: 200 OK2
[PRODUCER] Producing 3...
[CONSUMER] Consuming 3...
[PRODUCER] Consumer return: 200 OK3
[PRODUCER] Producing 4...
[CONSUMER] Consuming 4...
[PRODUCER] Consumer return: 200 OK4
[PRODUCER] Producing 5...
[CONSUMER] Consuming 5...
[PRODUCER] Consumer return: 200 OK5

以上這篇淺談Python生成器generator之next和send的運行流程(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2022日韩理论片在线观看 | 午夜性色一区二区三区不卡视频 | 深夜在线看 | 亚洲精品在看在线观看 | 国产精品高清视亚洲一区二区 | 成年男女免费视频 | 天美视频在线 | 色播影音先锋 | zozo日本另类极品 | 乌克兰肥熟 | 日本在线播放 | 日日干影院 | 美女扒开屁股让男人进去 | 日本欧美大码a在线视频播放 | www.久久艹| 高清毛片aaaaaaaaa片 | 脱女学小内内摸出水网站免费 | 无人区乱码区1卡2卡三卡在线 | 欧美洲大黑香蕉在线视频 | 亚洲精品国产在线观看 | 996热精品视频在线观看 | 学校捏奶揉下面污文h | 果冻传媒91 | 色综合天天综合 | 2018久久精品热在线观看 | 久久精品国产视频澳门 | 猛吸奶水的老汉 | 深夜福利免费在线观看 | 好骚好紧 | 美日韩一区二区三区 | 亚洲国产精品综合久久一线 | 日本高清视频在线免费观看 | 日本人成动漫网站在线观看 | 国模孕妇季玥全部人体写真 | 久草在在线免视频在线观看 | 果冻传媒天美传媒乌鸦传媒 | 日本漫画大全之工之口 | 成人看片免费无限观看视频 | 鬼吹灯之天星术免费观看 | 国产成人亚洲精品91专区手机 | 色婷婷在线播放 |