2013-01-06 3 views
21

발전기에서 raise StopIteration 문과 return 문을 사용하는 것의 차이점에 대해 궁금합니다.발전기에서 StopIteration을 발생시키는 것과 리턴 문을 비교하는 것의 차이점은 무엇입니까?

예를 들어이 두 기능간에 차이가 있습니까? 내가 할 수있는 더 "파이썬"방법을 추측하고있어

def my_generator0(n): 
    for i in range(n): 
     yield i 
     if i >= 5: 
      return 

def my_generator1(n): 
    for i in range(n): 
     yield i 
     if i >= 5: 
      raise StopIteration 

은 (내가 틀렸다면 수정하시기 바랍니다) 두 번째 방법이지만, 지금까지의 내가 볼 수있는 두 가지 방법은 StopIteration 예외를 발생시킨다.

+2

명시 적 또는 암시 ('단부 오프') 'return'는 발전기를 종료하도록 의도 된 방법이다. PEP 479가 승인되면, 'raise StopIteration'버전은 현재와 같이 작동하지 않습니다. –

답변

28

명시 적으로 StopIteration을 발생시킬 필요가 없습니다. 즉, return 문이 생성자 함수에 대해 수행하는 것과 같습니다. 그렇기 때문에 동일합니다. 하지만 아니요, 단지 return을 사용하면 더 Pythonic입니다. 가입일

: http://docs.python.org/2/reference/simple_stmts.html#the-return-statement (파이썬 3.2 유효) 함수 발생기에서

은 리턴 명령문은 expression_list를 포함 할 수 없다. 이러한 맥락에서 베어 리턴은 제너레이터가 완료되었음을 나타내며 StopIteration을 발생시킵니다.

또는 @Bakuriu가 지적으로

- 발전기의 의미는 파이썬 3.3 약간 변경, 그래서 다음이 더 적합 :

발전기 기능에서, return 문은 발전기가 있음을 나타냅니다 완료되면 StopIteration이 발생합니다. 반환 값 (있는 경우)은 StopIteration을 구성하는 인수로 사용되며 StopIteration.value 특성이됩니다.

+3

python3에서 return은 표현식 목록 인수를 가질 수 있습니다. http://docs.python.org/3.3/reference/simple_stmts.html#the-return-statement – Bakuriu

3

사실, 다른 하나는 가독성이있는 반면 다른 하나는 가독성이 있다는 점을 제외하고는 동일합니다. 이것은 발전기의 첫 번째 버전 (PEP 255, "Specification : Return")으로 거슬러 올라가며, 코 루틴 (coroutines)과 같은 후속 개선 사항은이를 변경하지 않습니다. 3.3의 yield from (PEP 380)은 raise StopIteration(<expr>)에 대한 구문 설탕을 return <expr>으로 확장하지만 그 의미는 return;으로 바뀌지 않습니다.

12

늦게까지 2014 return은 정확하고 발전기를 끝내기위한 raise StopIteration은 감가 상각 일정에 있습니다. 자세한 내용은 PEP 479을 참조하십시오.

이 PEP 추상

발전기의 변경을 제안한다 : StopIteration이 발전기 내부에서 발생할 때, 그것은 RuntimeError로 대체됩니다. 더 정확하게는 예외가 생성기의 스택 프레임에서 버블 될 때 발생합니다. 변경 사항이 이전 버전과 호환되지 않기 때문에 기능은 처음에 __future__ 문을 사용하여 도입되었습니다.

수용

이 PEP 11 월 22 일에 BDFL에 의해 받아 들여졌다 ...

이론적 근거

발전기의 상호 작용과 StopIteration을 현재 다소 놀라운 일이며, 모호한 버그를 은폐 할 수 있습니다.예기치 않은 예외가 미묘하게 변경된 동작을 초래해서는 안되지만 시끄럽고 쉽게 디버그 된 추적을 유발해야합니다. 현재, 생성자 함수 내에서 우연히 제기 된 StopIteration은 생성자를 구동하는 루프 구문에 의해 반복의 끝으로 해석됩니다.

...

관련 문제