2014-09-14 3 views
4

"yield"문이 함수에 있으면 생성자로 처리된다는 것을 알고 있습니다. 하지만 파이썬 인터프리터는 함수 (generator)가 처음 호출 할 때 어떻게 작동합니까? 즉, 코드가 해석 될 때 첫 번째 "gen"이 함수 객체에 바인드 될 것이라고 생각합니다. 처음 호출 할 때 일반 함수 나 클래스와 달리 yield를하기 전에 명령문을 실행하지 않는 이유는 무엇입니까? 이 파이썬 코드가 생성 또는 함수를 정의하면def 문이 결정 구문 분석 할 때 이전python이 함수를 생성자로 해석하는 방법

>>> def gen(): 
... print("In gen") 
... yield 1 
... yield 2 
... 
>>> type(gen) 
<type 'function'> 
>>> a = gen 
>>> type(a) 
<type 'function'> 
>>> 
>>> b = a() 
>>> type(b) 
<type 'generator'> 
>>> b.next() 
In gen 
1 
>>> b.next() 
2 
>>> 
+2

파이썬 생성기는 정의상 [lazy] (http://en.wikipedia.org/wiki/Lazy_evaluation)이기 때문에. 사용자가 소비하기 시작한 후에 만 ​​출력을 시작합니다 (예 : 반복). –

+0

나는 yield하기 전에 왜 yield 문 앞에 명령문을 실행하지 않는 것일까? 통역사는 어떻게 알 수 있습니까? – bluefoggy

+1

@ unutbu의 답에 덧붙여서 : Python은'yield' 문으로 함수 본문을 다르게 취급하기 때문에. 일단 거기에'yield '를 넣으면 정규 함수가 아닌 생성자를 정의 할 것입니다. 'yield'와'return' (인자와 함께)을 같은 함수에 넣으면 파이썬은 결코 그 함수를 사용하지 않더라도 그 코드를 컴파일하도록하지 않을 것입니다. –

답변

4

를 얻을 인쇄 기능의 실행에 보류를 넣어 않는 방법. 코드에 yield 표현식이 포함되어 있으면 생성자입니다. 따라서 생성자 함수 a이 호출되면 generator object, b을 반환합니다.

def 문 안의 코드는 b.next()이 호출 될 때까지 실행되지 않습니다.


이 두 기능을 고려 :

def gen(): 
    print('In gen') 
    yield 1 
    yield 2 


def func(): 
    print('In gen')  
gen 비록

func하는 두 기능이며, 파이썬은 gen이 발전기는 것을 알고 :

In [96]: import inspect 

In [101]: inspect.isgeneratorfunction(gen) 
Out[101]: True 

In [102]: inspect.isgeneratorfunction(func) 
Out[102]: False 

당신은 검사 모듈 내부에 보면 너는 볼거야

def isgeneratorfunction(object): 
    """Return true if the object is a user-defined generator function. 

    Generator function objects provides same attributes as functions. 

    See help(isfunction) for attributes listing.""" 
    return bool((isfunction(object) or ismethod(object)) and 
       object.func_code.co_flags & CO_GENERATOR) 

분명히 파이썬은 함수 내에서 코드를 실행하기 전에 이것을 먼저 검사합니다.

+0

def 문은 함수 내부의 블록에 대한 제어에 도달하지 않고 어떻게 처리합니까? 어떻게 찾습니까? – bluefoggy

+1

어떻게 def가 작동하는지, 그래서 조금 더 설명하면 도움이 될 것입니다. 난 그냥 함수 개체를 만들고 그것에 이름을 바인딩 생각. – bluefoggy

+1

모든 코드가 _compiled_가됩니다.컴파일러는 함수 정의의 내용을 검사하고'yield' 문을 찾고이 객체가 실제로 생성자인지를 결정합니다. – mtik00

관련 문제