파이썬 가이드 14 제너레이터

🏷️ 파이썬

제너레이터 (Generator)

파이썬 제너레이터(Generator)는 이터레이터(Iterator)를 생성하는 특별한 종류의 함수입니다. 일반 함수와 달리 return 대신 yield 키워드를 사용하여 값을 반환하며, 호출될 때마다 값을 순차적으로 산출합니다.

주요 특징 및 작동 방식: * yield 키워드: 제너레이터 함수는 yield를 만나면 값을 반환하고 실행을 일시 중지합니다. 다음에 next()가 호출되면 중단된 지점부터 실행을 다시 시작합니다. * 이터레이터 반환: 제너레이터 함수를 호출하면 즉시 함수 본문이 실행되지 않고, 이터레이터 객체(제너레이터 객체)를 반환합니다. * 상태 유지: 제너레이터는 yield를 통해 값을 반환한 후에도 자신의 내부 상태(지역 변수 등)를 기억하고 있다가, 다음 호출 시 이어서 작업을 수행합니다.

제너레이터를 사용하는 이유 (장점): * 메모리 효율성: 모든 값을 한꺼번에 메모리에 로드하지 않고 필요할 때마다 값을 생성하므로, 대규모 데이터 처리 시 메모리 사용을 최적화할 수 있습니다. 예를 들어, range() 함수는 파이썬 3.x에서 리스트 대신 시퀀스 타입 객체를 반환하여 메모리 효율성을 높였습니다. * 지연 평가(Lazy Evaluation): 필요한 시점에 데이터를 생성하므로, 무한 시퀀스를 다루거나 모든 데이터를 미리 계산할 필요가 없을 때 유용합니다. * 코드 간결성: 이터레이터를 직접 구현할 때 필요한 __iter__()__next__() 메서드를 정의하는 복잡한 과정을 yield 키워드 하나로 단순화할 수 있습니다.

제너레이터 표현식 (Generator Expression): 리스트 컴프리헨션과 유사하게 괄호 ()를 사용하여 간결하게 제너레이터 객체를 생성할 수 있습니다. 리스트 컴프리헨션이 전체 리스트를 메모리에 생성하는 반면, 제너레이터 표현식은 제너레이터를 반환하여 메모리 효율적입니다.

예시:


<!-- -->
# 제너레이터 함수
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3


<!-- -->
# 제너레이터 표현식
gen_exp = (x for x in range(5))
for num in gen_exp:
    print(num) # 0, 1, 2, 3, 4