以下是生成器功能。
def f():
x=1
while 1:
y = yield x
x += y
这个生成器函数(f
)是否在内部实现,如下所示?
class f(collections.Iterable):
def __init__(self):
self.x = 1
def __iter__(self):
return iter(self)
def __next__(self):
return self.x
def send(self, y):
self.x += y
return self.next()
修改
This就是我的问题的答案。
答案 0 :(得分:10)
在内部,生成器的工作方式与常规函数调用大致相同。引擎盖下,运行的发电机和运行功能大多使用相同的机器。
当您调用函数或生成器时,会创建堆栈帧。它具有局部变量(包括传递给函数的参数),指向活动操作码的代码指针,以及用于挂起的try-blocks,带有块或循环的堆栈。
在常规功能中,立即开始执行。遇到return
时,将保留最终结果,并释放堆栈框及其引用的所有内容。
在generator函数中,堆栈帧包装在generator-iterator对象中并立即返回。生成器函数中的代码仅在next(g)
或g.send(v)
调用时运行。遇到yield
时暂停执行。
考虑生成器的一种方法是它们就像可以使用yield
暂停并使用g.next()
恢复的函数。堆栈帧保持活动状态,因此恢复正在运行的生成器比生成一个新函数调用便宜 ,每次调用都需要构建一个新帧。