发电机功能如何在内部工作?

时间:2017-08-16 22:23:41

标签: python generator

以下是生成器功能。

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就是我的问题的答案。

1 个答案:

答案 0 :(得分:10)

在内部,生成器的工作方式与常规函数调用大致相同。引擎盖下,运行的发电机和运行功能大多使用相同的机器。

当您调用函数或生成器时,会创建堆栈帧。它具有局部变量(包括传递给函数的参数),指向活动操作码的代码指针,以及用于挂起的try-blocks,带有块或循环的堆栈。

在常规功能中,立即开始执行。遇到return时,将保留最终结果,并释放堆栈框及其引用的所有内容。

generator函数中,堆栈帧包装在generator-iterator对象中并立即返回。生成器函数中的代码仅在next(g)g.send(v)调用时运行。遇到yield时暂停执行。

考虑生成器的一种方法是它们就像可以使用yield暂停并使用g.next()恢复的函数。堆栈帧保持活动状态,因此恢复正在运行的生成器比生成一个新函数调用便宜 ,每次调用都需要构建一个新帧。