[python]生成器的高階應用send、close和throw方法
阿新 • • 發佈:2018-12-13
#send def gen_func(): # 這樣寫有兩個作用1. 可以產出值, 2. 可以接收值(呼叫方傳遞進來的值) html = yield "http://projectsedu.com" #這樣寫的話就是接收值 print(html) yield 1 yield 2 return "bobby" #1. 生成器不只可以產出值,還可以接收值 #流程是,呼叫的產出yield值, #下一次呼叫send的值會到變數,html裡面 if __name__ == "__main__": gen = gen_func() #首次,在呼叫send傳送非none值之前,我們必須啟動一次生成器, 方式有兩種1. gen.send(None), 2. next(gen) url = gen.send(None) #download url html = "bobby" print(gen.send(html)) #send方法可以傳遞值進入生成器內部,同時還可以重啟生成器執行到下一個yield位置 print(gen.send(html)) #1.啟動生成器方式有兩種, next(), send # print(next(gen)) # print(next(gen)) # print(next(gen)) # print(next(gen))
# close
def gen_func():
yield "http://projectsedu.com"
yield 2
yield 3
return "bobby"
if __name__ == "__main__":
gen = gen_func()
print(next(gen))
gen.close()
#print(next(gen)) #生成器close掉之後,在呼叫next方法,就會拋異常
print("bobby")
# throw def gen_func(): #1. 可以產出值, 2. 可以接收值(呼叫方傳遞進來的值) try: yield "http://projectsedu.com" except Exception as e: pass yield 2 yield 3 return "bobby" if __name__ == "__main__": gen = gen_func() print(next(gen)) gen.throw(Exception, "download error") #這個異常是扔到 yield "http://projectsedu.com"裡面的,雖然他以及執行過。yield 2會跳過 print(next(gen)) gen.throw(Exception, "download error")