我知道如何使用生成器,但对它们的内部一无所知。我尝试了这个:
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()
方法时,字节代码才会执行。