2015-01-13 4 views
2

저는 발전기 사용법을 알고 있지만 내부에 대해서는 아무것도 모릅니다. 나는 그것을 분해 이제발전기를 분해하면 놀라운 결과가 나타납니다.

In [4]: def f(): yield 1 
In [6]: type(f()) 
Out[6]: generator 

:

In [7]: dis.dis(f) 
    1   0 LOAD_CONST    1 (1) 
       3 YIELD_VALUE   
       4 POP_TOP    
       5 LOAD_CONST    0 (None) 
       8 RETURN_VALUE   

왜 옵 코드가 return None f 동안 실제로 발전기를 돌려 제안 않습니다 나는이 시도?

답변

5

모든 함수는 명시 적 반환이없는 경우 끝에 None을 반환합니다. 생성자도 예외는 아닙니다. 파이썬 3.3 이후로 생성자는 return a final value을 끝낼 수 있지만 파이썬 2.7에서는 함수를 일찍 끝내기 위해 return을 사용하면 빈 반환이 필수입니다.

이것은 파이썬 프레임이 구현되는 방법의 '제한 사항'입니다. 프레임을 완전히 종료하고 스택을 풀려면 opopcode가 있어야하며 opcode에는 항상 피연산자가 필요합니다.

함수를 호출해도 생성자는 여전히 생성되지만 바이트 코드은 실제로 생성자에서 .next() 메서드를 호출 할 때까지 실행되지 않습니다.

관련 문제