我知道如何使用发电机,但我对它们的内部结构一无所知。我试过这个:
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
实际返回生成器?
答案 0 :(得分:5)
如果没有显式返回,则所有函数在其末尾返回None
,生成器也不例外。从Python 3.3开始,生成器在结束时可以return a final value,但是在Python 2.7中,如果使用return
提前结束函数,则必须返回空白。
这是对Python框架实现方式的“限制”;你必须有一个RETURN_VALUE
操作码来干净地退出框架并展开堆栈,并且操作码总是需要一个操作数。
调用该函数仍然会生成一个生成器,但在实际调用生成器上的.next()
方法之前,字节代码不会执行。