亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Python中的yield表達(dá)式介紹

 更新時(shí)間:2019年11月19日 10:59:41   作者:jxzheng95  
今天小編就為大家分享一篇基于Python中的yield表達(dá)式詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

python生成器

python中生成器是迭代器的一種,使用yield返回函數(shù)值。每次調(diào)用yield會(huì)暫停,而可以使用next()函數(shù)和send()函數(shù)可以恢復(fù)生成器。

這里可以參考Python函數(shù)式編程指南:對(duì)生成器全面講解

注意到y(tǒng)ield是個(gè)表達(dá)式而不僅僅是個(gè)語(yǔ)句,所以可以使用x = yield r 這樣的語(yǔ)法。

這個(gè)知識(shí)點(diǎn)在協(xié)程中需要使用。協(xié)程的概念指的是在一個(gè)線程內(nèi),一個(gè)程序中斷去執(zhí)行另一個(gè)程序,有點(diǎn)類似于CPU中斷。這樣減少了切換線程帶來(lái)的負(fù)擔(dān),同時(shí)不需要多線程中的鎖機(jī)制,因?yàn)椴淮嬖谕瑫r(shí)寫(xiě)的問(wèn)題。

python使用生成器來(lái)實(shí)現(xiàn)協(xié)程,下面看一個(gè)python協(xié)程應(yīng)用于生產(chǎn)者消費(fèi)者問(wèn)題的例子

def consumer():
 r = 'yield'
 while True:
  #當(dāng)下邊語(yǔ)句執(zhí)行時(shí),先執(zhí)行yield r,然后consumer暫停,此時(shí)賦值運(yùn)算還未進(jìn)行
  #等到producer調(diào)用send()時(shí),send()的參數(shù)作為yield r表達(dá)式的值賦給等號(hào)左邊
  n = yield r #yield表達(dá)式可以接收send()發(fā)出的參數(shù)
  if not n:
   return
  print('[CONSUMER] Consuming %s...' % n)
  r = '200 OK'

def produce(c):
 c.send(None)
 n = 0
 while n < 5:
  n = n + 1
  print('[PRODUCER] Producing %s...' % n)
  r = c.send(n) #調(diào)用consumer生成器
  print('[PRODUCER] Consumer return: %s' % r)
 c.close()

c = consumer()
produce(c)

注意到send需要先調(diào)用send(None),因?yàn)橹挥猩善魇菚和顟B(tài)才可以接收send的參數(shù)。

為了理解send()恢復(fù)生成器的過(guò)程,我們可以再看一個(gè)例子:

def gen():
 a = yield 1
 print('yield a % s' % a)
 b = yield 2
 print('yield b % s' % b)
 c = yield 3
 print('yield c % s' % c)


r = gen()
x = next(r)
print('next x %s' % x)
y = r.send(10)
print('next y %s' %y)
z = next(r)
print('next z %s' % z)

可以看到實(shí)際上y=r.send(10) 的參數(shù)10是賦給了a。整個(gè)運(yùn)行過(guò)程即執(zhí)行x=next(r) 之后,gen()執(zhí)行了yield 1 然后暫停,沒(méi)有進(jìn)行對(duì)a的賦值。但再調(diào)用y=r.send(10) 時(shí)賦值過(guò)程繼續(xù),并把10賦給了a.

以上這篇基于Python中的yield表達(dá)式介紹就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論