Python의 제너레이터(generator)는 반복자(iterator)를 생성하는 간단하고 효율적인 방법입니다. 큰 데이터를 처리할 때 메모리 사용을 최적화하고 코드의 간결성을 높일 수 있습니다. 이번 글에서는 제너레이터의 기본 개념과 사용 방법, 그리고 장점에 대해 살펴보겠습니다.
제너레이터의 기본 개념
제너레이터는 이터레이터를 반환하는 함수로, yield 표현식을 사용합니다. 함수가 yield를 만나면, 현재 함수의 상태를 기억하고, 다음 호출시에 다시 그 상태부터 실행을 계속합니다.
특징
상태 유지: 제너레이터는 마지막으로 실행된 지점과 그 상태를 기억합니다.
Lazy Evaluation: 제너레이터는 필요할 때까지 값이 생성되지 않습니다. 이는 메모리를 효율적으로 사용하는 데 도움이 됩니다.
코드 간결성: 복잡한 반복 로직을 간결하게 표현할 수 있습니다.
예제 코드
def simple_generator():
yield 1
yield 2
yield 3
# 제너레이터 사용
gen = simple_generator()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
simple_generator 함수는 yield 키워드를 사용합니다. yield는 함수의 실행을 일시 중지하고, 값을 반환합니다. 이 함수는 호출될 때 세 번의 값을 차례로 생성합니다.
첫 번째 yield 1은 함수를 처음 호출할 때 1을 반환하고 실행을 일시 중지합니다.
두 번째 yield 2는 함수가 다시 호출될 때 실행되며, 2를 반환하고 다시 중지합니다.
마지막으로 yield 3은 세 번째 호출에서 3을 반환하고 실행이 종료됩니다.
next(gen) 호출은 제너레이터에게 다음 값을 생성하도록 요청합니다. 처음 next(gen)을 호출하면, 제너레이터는 yield 1에서 중지된 지점부터 시작하여 첫 번째 값을 생성하고 반환합니다. 이 때, 출력 결과는 1이 됩니다. 두 번째와 세 번째 next(gen) 호출은 각각 2와 3을 출력합니다. 각각의 호출은 제너레이터가 이전에 멈춘 지점에서 실행을 재개하여 다음 yield 표현식까지 진행하고 해당 값을 반환합니다. 제너레이터에서 더 이상 반환할 값이 없을 때(즉, 모든 yield 표현식이 실행된 후) next()를 호출하면 StopIteration 예외가 발생합니다. 이는 제너레이터의 끝을 나타냅니다. 제너레이터는 일반적으로 for 루프와 함께 사용될 때 가장 효율적입니다. for 루프는 StopIteration 예외를 자동으로 처리하므로, 제너레이터의 모든 값을 안전하게 순회할 수 있습니다.
제너레이터는 Python 프로그래밍에서 중요한 도구로, 메모리 관리와 코드 간결성 측면에서 큰 장점을 가집니다. 특히 대용량 데이터를 처리하거나 복잡한 이터레이터 로직을 구현할 때 유용하게 사용될 수 있습니다. 제너레이터의 이해와 적절한 활용은 Python 프로그래밍의 효율성을 크게 높일 수 있습니다.
'Programming > Python' 카테고리의 다른 글
Python Flask 란? (0) | 2023.12.22 |
---|---|
[Python] pymysql 사용하기 (0) | 2023.12.11 |
Python의 데코레이터 (0) | 2023.11.24 |
Python의 타입 힌트 (0) | 2023.11.10 |
Python에서의 메모리 관리와 가비지 컬렉션 (0) | 2023.10.27 |
댓글