def gen_01():
print('gen_01--before y1--')
y1=yield 'yield_y1'
print('gen_01--after y1:{}--'.format(y1))
print('gen_01--before y2--')
y2=yield 'yield_y2'
print('gen_01--after y2:{}--'.format(y2))
return 'jet'
def main_01():
gen=gen_01()
s1=gen.send(None) #預激生成器
print('main_01-gen-s1:{}'.format(s1))
print('main_01-gen.close()')
gen.close()
print('main_01-gen-s2 start')
s2=gen.send(None)
'''
執(zhí)行:
main_01()
輸出結(jié)果:
gen_01--before y1--
預激生成器后,程序從調(diào)用者main_01切換到生成器代碼色瘩,
生成器代碼執(zhí)行到第一個yield 手蝎,然后將yield 右邊的值傳遞給調(diào)用者main,程序切換到調(diào)用者main執(zhí)行
main_01-gen-s1:yield_y1
main_01-gen.close()
調(diào)用者main接受生成器傳遞過來的參數(shù),然后繼續(xù)執(zhí)行到close
main_01-gen-s2 start
調(diào)用者main執(zhí)行send座韵,代碼跳轉(zhuǎn)到生成器
Traceback (most recent call last):
File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 45, in <module>
main_01()
File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 18, in main_01
s2=gen.send(None)
StopIteration
生成器產(chǎn)生StopInteration并向上拋出换薄,表示生成器執(zhí)行完成,接盤俠調(diào)用者main負責處理
'''
def main_02():
gen=gen_01()
s1=gen.send(None) #預激生成器
print('main_01-gen-s1:{}'.format(s1))
print('main_01-gen.close()')
gen.close()
try:
gen.send(None)
except StopIteration as e:
print('----:{} -'.format(e))
'''
執(zhí)行:
main_02()
輸出結(jié)果:
gen_01--before y1--
main_01-gen-s1:yield_y1
main_01-gen.close()
由此可見close就關(guān)閉生成器暮刃,任何接下來的send或者next都會導致StopInteration,
而且這個StopInteration并不會包含生成器return的值
'''
def gen_03():
print('gen_01--before y1--')
y1=yield 'yield_y1'
print('gen_01--after y1:{}--'.format(y1))
print('gen_01--before y2--')
y2=yield 'yield_y2'
print('gen_01--after y2:{}--'.format(y2))
return 'jet'
def main_03():
gen=gen_03()
s1=gen.send(None) #預激生成器
print('main_03-s1:{}'.format(s1))
gen.throw(Exception,'happy error!')
'''
調(diào)用
main_03
執(zhí)行結(jié)果:
gen_01--before y1--
生成器向調(diào)用者返回yield右邊的值,卡在第一個yield,程序跳回調(diào)用者main
main_03-s1:yield_y1
調(diào)用者main接受生成器傳遞過來的數(shù)據(jù)帆疟,并繼續(xù)往下執(zhí)行鹉究,直到執(zhí)行到throw
Traceback (most recent call last):
File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 82, in <module>
main_03()
File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 79, in main_03
gen.throw(Exception,'happy error!')
File "/home/qing/PythonWebApp/02_異步IO/02_asyncio案例/02關(guān)于生成器的close與throw方法.py", line 66, in gen_03
y1=yield 'yield_y1'
Exception: happy error!
生成器中卡住的yiled那里(第一個yield那里)并沒有處理異常的代碼,所以我們造的異常還是拋給了調(diào)用者接盤俠main函數(shù)
'''
def gen_04():
print('gen_04--before y1--')
try:
y1 = yield 'yield_y1'
except Exception as e:
print('一個來的調(diào)用者的異常:{}'.format(e))
y1='Sorry'
print('gen_04--after y1:{}--'.format(y1))
print('gen_04--before y2--')
y2 = yield 'yield_y2'
print('gen_04--after y2:{}--'.format(y2))
return 'jet'
def main_04():
gen = gen_04()
s1 = gen.send(None) # 預激生成器
print('main_04-s1:{}'.format(s1))
s2=gen.throw(Exception, 'happy error!')
print('main_04-s2:{}'.format(s2))
'''
執(zhí)行:
main_04
執(zhí)行結(jié)果:
gen_04--before y1--
main_04-s1:yield_y1
一個來的調(diào)用者的異常:happy error! #由于我們處理完了異常踪宠,生成器一直執(zhí)行到第二個yield,然后生成器將第二個yield右邊的值返回給調(diào)用者main
gen_04--after y1:Sorry--
gen_04--before y2--
main_04-s2:yield_y2 #程序跳回調(diào)用者main,調(diào)用者main接受參數(shù)并繼續(xù)執(zhí)行
'''
'''
以上就是我們向生成器拋出異常的流程
其實和我們向生成器send數(shù)據(jù)的時機是一樣的自赔,都是在yield卡主切換到調(diào)用者,調(diào)用者向生成器傳遞柳琢,
與send不同的是绍妨,send傳遞值,然后程序切換到生成器代碼柬脸,生成器代碼在卡住的yield位置接受值并繼續(xù)往下執(zhí)行
而throw傳遞異常,然后程序切換到生成器代碼他去,生成器代碼在卡住的yield位置捕獲異常然后處理并繼續(xù)往下執(zhí)行
'''
'''
利用生成器對外跑出異常,我們可以讓生成器提前結(jié)束
'''
def gen_05():
print('gen_05--before y1--')
try:
y1 = yield 'yield_y1'
except Exception as e:
print('一個來的調(diào)用者的異常:{},我們接下來跑出StopIteration向上拋出'.format(e))
raise StopIteration()
print('gen_05--after y1:{}--'.format(y1))
print('gen_05--before y2--')
y2 = yield 'yield_y2'
print('gen_05--after y2:{}--'.format(y2))
return 'jet'
def main_05():
gen = gen_05()
s1 = gen.send(None) # 預激生成器
print('main_05-s1:{}'.format(s1))
try:
s2=gen.throw(Exception, 'happy error!')
except:
print("生成器 拋出StopInteration后倒堕,程序跳轉(zhuǎn)到調(diào)用者main--")
print('main_05:繼續(xù)調(diào)用send方法測試下生成器有沒有結(jié)束')
try:
s3=gen.send('戳一戳')
except StopIteration as e:
print('main_01 獲取拋車異常StopInteration:{} -'.format(e))
else:
print('main_01 s3:{}'.format(s3))
"""
由此可見灾测,當生成器主動拋出StopInteration異常,也能讓生成器提前結(jié)束垦巴,媳搪,,
"""
02生成器的close與throw方法
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門蔗候,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人埂软,你說我怎么就攤上這事锈遥∪沂拢” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵所灸,是天一觀的道長丽惶。 經(jīng)常有香客問我,道長爬立,這世上最難降的妖魔是什么钾唬? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮侠驯,結(jié)果婚禮上抡秆,老公的妹妹穿的比我還像新娘。我一直安慰自己吟策,他們只是感情好儒士,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著檩坚,像睡著了一般着撩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匾委,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼运嗜!你這毒婦竟也來了壶辜?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布娄徊,位于F島的核電站闽颇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寄锐。R本人自食惡果不足惜兵多,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锐峭。 院中可真熱鬧中鼠,春花似錦、人聲如沸沿癞。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽椎扬。三九已至惫搏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚕涤,已是汗流浹背筐赔。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 我用mybatis生成器龄寞,生成時總有兩個model類汰规,一個是PO類,一個是example,但example我不想要...
- “非非~” “哎科阎,你慢著點在抛。”莫非慌忙轉(zhuǎn)身接住撲過來的李小白萧恕,手都沒來得及擦刚梭。 李小白低頭看了看自己的衣服,盯了幾...
- 先了解下Runloop的幾種模式簿煌,常用的有兩種氮唯,NSDefaultRunLoopMode 默認模式、UITrack...