2015-01-13 74 views
2

我知道如何使用發電機,但我不知道他們的內部任何事情。我嘗試這樣做:拆解發電機產生令人驚訝的結果

In [4]: def f(): yield 1 
In [6]: type(f()) 
Out[6]: generator 

現在我拆開它:

In [7]: dis.dis(f) 
    1   0 LOAD_CONST    1 (1) 
       3 YIELD_VALUE   
       4 POP_TOP    
       5 LOAD_CONST    0 (None) 
       8 RETURN_VALUE   

爲什麼操作碼暗示return Nonef實際上返回發電機?

回答

5

如果沒有顯式返回,則所有函數返回None,生成器也不例外。從Python 3.3開始,生成器在結束時可以return a final value,但在Python 2.7中,如果使用return來儘早結束函數,則必須使用空白返回。

這是Python框架如何實現的'限制';你必須有一個RETURN_VALUE操作碼來乾淨地退出框架並展開堆棧,並且該操作碼總是需要一個操作數。

調用該函數仍會生成一個生成器,但字節代碼不會執行,直到您實際調用生成器上的.next()方法爲止。

相關問題