파이썬 제너레이터(Generator) 이해하기: 개념과 사용 예제
파이썬의 제너레이터는 효율적인 반복을 위한 핵심 도구입니다. 이번 글에서는 제너레이터가 무엇인지, 그리고 파이썬에서 어떻게 사용하는지에 대해 알아보겠습니다.
▼ 목차
- 제너레이터의 정의
- 제너레이터의 필요성
- 파이썬에서의 제너레이터 사용법
- 제너레이터 만드는 방법
- 제너레이터 사용 예제
1. 제너레이터의 정의
제너레이터는 파이썬의 특별한 종류의 이터레이터입니다. 일반 이터레이터와는 다르게, 제너레이터는 모든 값이 미리 계산되지 않고, 요청에 따라 하나씩 값을 생성합니다.
2. 제너레이터의 필요성
제너레이터는 크게 두 가지 장점이 있습니다. 첫째, 제너레이터는 모든 값을 미리 계산하지 않기 때문에 메모리를 절약할 수 있습니다. 둘째, 제너레이터를 이용하면 반복 로직을 표현하기가 더 쉽습니다.
3. 파이썬에서의 제너레이터 사용법
제너레이터는 함수를 정의하는 과정에서 ‘yield‘ 키워드를 사용해 만들 수 있습니다. 이 함수를 호출하면 제너레이터 객체가 반환되고, 이 객체는 이터레이터 프로토콜을 따릅니다.
▼ 사용 예제
def simple_generator():
yield 1 # 첫 번째 호출에 1을 반환
yield 2 # 두 번째 호출에 2를 반환
yield 3 # 세 번째 호출에 3을 반환
gen = simple_generator() # 제너레이터 함수를 호출하여 제너레이터 객체를 생성
print(next(gen)) # 첫 번째 요소인 '1' 출력
print(next(gen)) # 두 번째 요소인 '2' 출력
print(next(gen)) # 세 번째 요소인 '3' 출력
위 코드는 간단한 제너레이터 함수를 정의하고 사용하는 예제입니다. 제너레이터 함수는 ‘yield’ 키워드를 포함하며, 이 함수를 호출하면 제너레이터 객체가 반환됩니다. 이 객체는 next() 함수로 하나씩 값을 꺼낼 수 있는 이터레이터입니다.
위의 제너레이터와 동일한 기능을 하는 이터레이터 코드를 작성하면 다음과 같습니다.
▼ 사용 예제
class SimpleIterator:
def __init__(self):
self.current = 1 # 현재값을 1로 설정
def __iter__(self):
return self # 인스턴스 자신을 반환
def __next__(self):
if self.current <= 3: # 현재값이 3 이하인 경우
num = self.current # 현재값을 num에 저장
self.current += 1 # 현재값을 1 증가
return num # num을 반환
else:
raise StopIteration # 더 이상 반환할 값이 없으면 StopIteration 예외 발생
it = SimpleIterator() # 이터레이터 객체를 생성
print(next(it)) # 첫 번째 요소인 '1' 출력
print(next(it)) # 두 번째 요소인 '2' 출력
print(next(it)) # 세 번째 요소인 '3' 출력
제너레이터와 이터레이터의 가장 큰 차이점은 제너레이터는 ‘yield‘ 키워드를 사용하여 값을 하나씩 반환하고, 이터레이터는 ‘__next__()‘ 메소드에서 값을 직접 반환하거나 StopIteration 예외를 직접 발생시킨다는 점입니다. 또한 제너레이터는 함수 형태로 표현되며, 이터레이터는 보통 클래스 형태로 표현됩니다.
4. 제너레이터 만드는 방법
제너레이터를 만드는 방법은 크게 두 가지입니다. 첫째, 함수 안에 ‘yield‘ 키워드를 사용하는 방법이 있습니다. 이 방법은 함수가 호출될 때마다 yield 이후의 값이 반환되고, 함수의 실행 상태가 유지되는 특징이 있습니다. 둘째, 제너레이터 표현식을 사용하는 방법이 있습니다. 이 방법은 리스트 표현식과 비슷하지만, 대괄호 대신 괄호를 사용합니다.
▼ 예제 코드
# 제너레이터 함수
def count_up_to(n):
i = 1
while i <= n:
yield i
i += 1
# 제너레이터 표현식
gen_exp = (x**2 for x in range(10))
for number in count_up_to(5):
print(number) # 1부터 5까지 출력
for number in gen_exp:
print(number) # 0부터 81까지 제곱수 출력
위 예제 코드에서, 첫 번째 방법인 ‘count_up_to’ 함수는 입력받은 수까지 숫자를 생성하는 제너레이터입니다. 함수가 호출될 때마다 다음 숫자를 생성하고 반환합니다. 두 번째 방법인 제너레이터 표현식 ‘gen_exp’는 0부터 9까지의 수를 제곱하여 생성합니다.
5. 제너레이터 사용 예제
제너레이터는 다양한 상황에서 활용할 수 있습니다. 예를 들어, 무한 시퀀스를 생성하거나, 대량의 데이터를 처리할 때 메모리를 절약하거나, 복잡한 제어 흐름을 간소화하는 데 사용할 수 있습니다.
▼ 예제 코드
# 무한 시퀀스 생성
def infinite_sequence():
num = 0
while True:
yield num
num += 1
# 대량의 데이터 처리
def read_large_file(file_path):
with open(file_path) as file:
for line in file:
yield line
# 복잡한 제어 흐름 간소화
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
위 코드는 제너레이터가 어떻게 다양한 상황에서 활용될 수 있는지 보여주는 예시입니다. ‘infinite_sequence’는 무한 시퀀스를 생성하는 제너레이터, ‘read_large_file’는 대량의 데이터를 처리하는 제너레이터, ‘fibonacci’는 복잡한 제어 흐름을 간소화하는 제너레이터입니다.
☞ 파이썬의 제너레이터는 메모리 효율과 코드의 가독성을 향상시키는 데 큰 도움이 됩니다. 제너레이터는 파이썬 프로그래밍에서 매우 중요한 도구이므로, 잘 이해하고 사용하는 것이 중요합니다.
참고 자료
- 파이썬 공식 문서 – 제너레이터: https://docs.python.org/3/glossary.html#term-generator
함께 보면 좋은 이전 게시글
- 파이썬 이터레이터(Iterator) 이해하기: 개념과 사용 예제
- 파이썬 함수 사용법: 매개변수와 인수, 람다 함수
- 파이썬 클로저(Closure): 정의, 사용 이유, 예제를 통한 이해
- 파이썬 데코레이터(Decorator) 이해하기: 사용 이유와 예제
- 파이썬 itertools 라이브러리: 순열, 조합 및 고급 반복 도구 활용하기
이 글이 도움이 되셨다면 공유를 부탁 드립니다. 다음 글에서 뵙겠습니다!