在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ python yield 和finally 相關(guān)的一個(gè)問題

python yield 和finally 相關(guān)的一個(gè)問題

請(qǐng)問下面兩種方式的代碼,輸出結(jié)果順序?yàn)槭裁床灰粯樱?
code1輸出為:
end
65
而code2輸出為:
65
end

code 1:

def af():
    a=65
    try:
       yield a

    finally:
        print('end')

print(af().next())

code 2:

def af():
    a=65
    try:
       yield a

    finally:
        print('end')

g=af()
print(g.next())
回答
編輯回答
離魂曲

PEP 342: finally 一定會(huì)被執(zhí)行,無(wú)論生成器是否執(zhí)行結(jié)束,finally實(shí)際是被garbage collection執(zhí)行的。所以你直接af().next()時(shí),af()是個(gè)臨時(shí)對(duì)象,會(huì)在print調(diào)用之前先被gc回收,自然先出現(xiàn)end,而g.next()則是正常的方式,g在主程序結(jié)束前始終存在,所以end出現(xiàn)在程序運(yùn)行結(jié)束之后,即python在主程序運(yùn)行結(jié)束后運(yùn)行g(shù)c才會(huì)執(zhí)行finally里面的內(nèi)容

2018年4月19日 17:30
編輯回答
還吻

finally里的內(nèi)容會(huì)在析構(gòu)時(shí)執(zhí)行,所以af先出現(xiàn)end

2017年1月25日 03:33
編輯回答
撥弦

說(shuō)說(shuō)我的理解。
如果不實(shí)例化一個(gè)生成器,直接調(diào)用af().__next__方法后,生成器會(huì)被“關(guān)閉”,“關(guān)閉”前會(huì)執(zhí)行finally。
實(shí)例化生成器g,調(diào)用g.__next__()方法后,g并不會(huì)“關(guān)閉”,自然也就暫時(shí)不會(huì)執(zhí)行finally,直到stopiteration或主程序結(jié)束才執(zhí)行finally。

2017年1月7日 18:14