yield的功能和return非常類似,它們都只能在方法中使用。不同的是,包含yield語句的方法被稱為生成器方法。當調用生成器方法時,會返回一個生成器對象。
例如,看下面的例子。
def MyGenerator(): yield 1gen = MyGenerator()PRint gen輸出結果為<generator object MyGenerator at 0x0000000001D9DD80>當調用生成器對象的next方法時,會執行生成器方法中的代碼,直至遇到yield語句時,方法的執行過程會被掛起。同時,方法運行的上下文環境會被保存。而next方法的返回值就是yield關鍵字后面表達式的返回值。
例如,下面代碼
print gen.next()執行結果為1當我們繼續調用next方法時,從上一次掛起的地方開始,繼續執行后面的代碼。直至遇到下一個yield語句。當方法執行完畢,依然沒有遇到yield語句,拋出StopIteration異常。例如
def MyGenerator(): yield 1 yield 'a'gen = MyGenerator()print gen.next()print gen.next()print gen.next()上面代碼中第1次調用next方法,執行語句yield 1。第2次調用next方法,執行語句yield 'a'。第3次調用next方法時,在方法退出前都沒有遇到yield語句,因此拋出StopIteration異常。上面介紹的生成器方法的工作機理。在后面的博文中,會逐步介紹生成器方法的一些經典應用。
新聞熱點
疑難解答