iterator - python generator用法 - "产量 "这个关键词有什么作用?

Python generator / python / generator / yield / coroutine

Python中 yield 关键字的用途是什么?

例如,我试图理解这段代码1

def _get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild  

这是来电者。

result, candidates = [], [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
    candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result

iliketocode



Answer #1

在continuation passing style (CPS)中,continuation只是普通的函数(只有在函数是第一类的语言中),程序员明确地管理并传递给子程序。在这种风格中,程序状态由闭包(以及恰好被编码在其中的变量)来表示,而不是驻留在堆栈某个地方的变量。管理控制流的函数接受continuation作为参数(在CPS的某些变体中,函数可以接受多个continuation),并通过简单地调用它们并在之后返回来操纵控制流。一个非常简单的延续传递风格的例子如下。

def save_file(filename):
  def write_file_continuation():
    write_stuff_to_file(filename)

  check_if_file_exists_and_user_wants_to_overwrite(write_file_continuation)

现在让我们谈谈Python中的生成器。生成器是延续的特定子类型。而延续能够一般保存计算的状态(即程序调用堆栈),发电机只能保存迭代的状态经过一个迭代器。虽然,对于发电机的某些使用情况,此定义会产生误导。例如:

def f():
  while True:
    yield 4
class Generator():
  def __init__(self,iterable,generatorfun):
    self.next_continuation = lambda:generatorfun(iterable)

  def next(self):
    value, next_continuation = self.next_continuation()
    self.next_continuation = next_continuation
    return value
def generatorfun(iterable):
  if len(iterable) == 0:
    raise StopIteration
  else:
    return (iterable[0], lambda:generatorfun(iterable[1:]))