生成器的throw和close方法

2022-04-11 08:52:09 字數 1252 閱讀 2552

def

gen_func():

try:

yield 1

except

exception as e:

pass

yield 2

yield 3

yield 4

yield 5

return

"bobby"if

__name__ == "

__main__":

gen =gen_func()

print

(next(gen))

a=gen.throw(exception,

"download error")

print (a)#2

print(next(gen))#

注意,列印的是3不是2

throw有兩方面的作用,首先是拋給生成器乙個異常,然後如果生成器能處理掉異常的話,throw方法接著迭代一次取得返回值,比如上面這個案例就拋給了生成器乙個exception異常,然後生成器處理掉了。注意,捕獲異常是在上一次迭代中斷的位置捕獲,因為每次生成器執行的時候,都是從上一次發生yield中斷的地方開始執行,所以拋來的異常發生在這個地方,捕獲當然也要在這個地方。因為這個例子中異常被處理了,所以throw方法要完成他的第二張任務:讓生成器迭代一次。於是,a為2

再說close,他只有乙個作用,就是像生成器丟擲generatorexit異常。

def

mygenerator():

try:

yield 1

yield 2

except

generatorexit:

print ("aa"

)

#yield 如果加上這句話,則生成器丟擲runtimeerror,close與前面文章generatorexit的最後乙個例子中的del不同,這個runtimeerror主程式不會忽略,主程式因此異常而退出

gen =mygenerator()

print

(next(gen))

gen.close()

print ('bb'

)'''

aabb

'''

關於xlose,可參考

的論述:

generatorexit異常的產生意味著生成器物件的生命週期已經結束。因此,一旦產生了generatorexit異常,生成器方法後續執行的語句中,不能再有yield語句,否則會產生runtimeerror。

迭代和生成器

列表迭代的本質 iter 函式返回乙個迭代器,然後可以呼叫迭代器上的next方法 arr 1,2,3,4,5 arr iterator arr.iter print arr iterator.next print next arr iterator 乙個典型的迭代器實現。例子來自 流暢的python...

生成器 PHP的生成器yield 原創

在php 5.5中,php多了乙個新的特性,那就是生成器 generator 生成器提供了一種更簡單的方法來實現簡單的物件迭代。下面的manual的引用 生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類實現 iterator 介面的方式,效能開銷和複雜性大大降低。生成器允許你在 for...

python 生成器作用 Python生成器

生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...