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

我知道如何使用生成器,但对它们的内部一无所知。我尝试了这个:

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 None实际上返回生成器时,操作码为何建议f

python大神给出的解决方案

如果没有显式返回,则所有函数均在其末尾返回None,生成器也不例外。从Python 3.3开始,生成器可以在结束时return a final value,但是在Python 2.7中,如果使用return尽早结束函数,则必须返回空白。

这是实现Python框架的“局限性”。您必须有一个RETURN_VALUE操作码才能干净地退出框架并展开堆栈,并且该操作码始终需要一个操作数。

调用该函数仍会生成一个生成器,但是直到您实际在生成器上调用.next()方法时,字节代码才会执行​​。