1. 程式人生 > >[python]生成器的高階應用send、close和throw方法

[python]生成器的高階應用send、close和throw方法

#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")