Python iterator - "수익"키워드의 기능은 무엇입니까?

Python iterator generator / python / iterator / 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

연속 전달 스타일 (CPS)에서 연속은 프로그래머가 명시 적으로 관리하고 서브 루틴으로 전달하는 일반 함수 (함수가 1 급인 언어에서만)입니다. 이 스타일에서 프로그램 상태는 스택 어딘가에 상주하는 변수가 아니라 클로저 (및 인코딩되는 변수)로 표시됩니다. 제어 흐름을 관리하는 함수는 연속을 인수로 받아들이고 (일부 CPS 변형에서는 함수가 여러 연속을 허용 할 수 있음) 단순히 호출하고 나중에 반환하여 제어 흐름을 조작합니다. 연속 전달 스타일의 매우 간단한 예는 다음과 같습니다.

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:]))