拆卸发电机会产生令人惊讶的结果

usu*_* me 2 python yield generator python-2.7 python-internals

我知道如何使用发电机,但我对它们的内部结构一无所知.我试过这个:

In [4]: def f(): yield 1
In [6]: type(f())
Out[6]: generator
Run Code Online (Sandbox Code Playgroud)

现在我拆开它:

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        
Run Code Online (Sandbox Code Playgroud)

为什么操作码会return Nonef实际返回生成器时提示?

Mar*_*ers 5

None如果没有明确的返回,所有函数都返回它们,生成器也不例外.从Python 3.3开始,生成器在结束时可以返回最终值,但是在Python 2.7中,如果您使用return早期结束函数,则必须返回空白.

这是对Python框架实现方式的"限制"; 你必须有一个RETURN_VALUE操作码来干净地退出框架并展开堆栈,并且操作码总是需要一个操作数.

调用该函数仍然会生成一个生成器,但在实际调用生成器上的方法之前,不会执行字节代码.next().