Python Generator?

wikidocs.net에서 발췌하였습니다.

  • generator : iterator를 생성해주는 함수, 함수안에 yield 키워드를 사용함
  • genrator 특징
    • iterable한 순서가 지정됨(모든 generator는 iterator)
    • 느슨하게 평가된다.(순서의 다음 값은 필요에 따라 계산됨)
    • 함수의 내부 로컬 변수를 통해 내부상태가 유지된다.
    • 무한한 순서가 있는 객체를 모델링할 수 있다.(명확한 끝이 없는 데이터 스트림)
    • 자연스러운 스트림 처리를 위 파이프라인으로 구성할수 있다.(Java에서 파일스트림 처리시에 특정 바이트단위로 반복하는 것을 말하는듯..)

yield

yield는 python 3.3 이후부터 사용 가능

result = [x**2 for in range(4)]
print(result)
# 결과값 [0,1,4,9] 

# 위 loop를 generator로 만들려면 ()로 결과값을 묶어주면 된다.
result = (x**2 for in range(4))
print(type(result))

def get_result(result_arr)
    for i in result_arr:
        yield i

# yield가 호출되면 암시적으로 return이 호출된다.
print(next(get_result(result))) # 결과값 0

# list로 변환해서 출력하기
print(list(get_result(result))) # 결과값 [0,1,4,9]

# 만약에 결과값을 변수에 할당 후 위의 출력을 실행하면 결과가 다르게 나온다.
result_get = get_result(result)

print(next(result_get)) # 결과값 0

print(list(result_get)) # 결과값 [1,4,9]

another sample

#python 3 version source
#yield test source
#yield_Routine_Test.py
 
def generator_test(n):
    print("-=-=-=-=-=-= Generator Start =-=-=-=-=-=-")
     
    while(n <3):
        print("<< Before Yield >>")
        yield n
        n+= 1
        print("<< After Yield >>")
         
    print("-=-=-=-=-=-= Generator End =-=-=-=-=-=-")
     
if __name__== "__main__":
    print("---------- Main Function Start ----------")
     
    for iin generator_test(0):
        print("Start For))))))))))))")
        print("Yield i is : ", i)
        print("End For))))))))))))))")
         
    print("---------- Main Function End ----------")