Python 이터레이터와 제너레이터Language/Python2023. 10. 27. 17:38
Table of Contents
이터레이터(iterator)와 제너레이터(generator)는 파이썬에서 반복(iteration)을 구현하고 데이터를 효율적으로 처리하는 중요한 개념입니다. 이 글에서는 이 두 가지를 비교하고 구체적인 예제를 통해 설명합니다.
이터레이터(iterator)란?
이터레이터는 데이터를 하나씩 순서대로 처리할 수 있는 객체입니다. 파이썬에서 이터레이터 객체는 __iter__()와 __next__() 메서드를 구현해야 합니다.
이터레이터의 특징
- 데이터를 순서대로 하나씩 반환.
__next__()메서드 호출 시 다음 값을 반환하며, 더 이상 값이 없으면StopIteration예외 발생.- 한 번 사용한 데이터는 다시 접근할 수 없음.
이터레이터 구현 예제
다음은 간단한 이터레이터를 구현하는 코드입니다.
class Counter:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self # 이터레이터 객체를 반환
def __next__(self):
if self.current <= self.end:
number = self.current
self.current += 1
return number
else:
raise StopIteration # 반복이 끝났음을 알림
# 이터레이터 사용
counter = Counter(1, 5)
for num in counter:
print(num) # 1, 2, 3, 4, 5 출력
제너레이터(generator)란?
제너레이터는 이터레이터를 더 쉽게 만들 수 있도록 도와주는 함수입니다. 함수 안에서 yield 키워드를 사용해 값을 생성하며, 호출될 때마다 실행이 멈춘 지점부터 재개됩니다.
제너레이터의 특징
- 함수 기반으로 동작하며
yield로 값을 생성. - 상태를 유지하며, 필요한 시점에 값 생성.
- 메모리 효율적(값을 한 번에 생성하지 않고 필요할 때만 생성).
제너레이터 구현 예제
아래는 앞서 작성한 Counter를 제너레이터로 구현한 예제입니다.
def counter(start, end):
current = start
while current <= end:
yield current
current += 1
# 제너레이터 사용
for num in counter(1, 5):
print(num) # 1, 2, 3, 4, 5 출력
이터레이터와 제너레이터의 차이점
| 특징 | 이터레이터 | 제너레이터 |
|---|---|---|
| 구현 복잡도 | 클래스와 메서드를 모두 구현해야 함 | 함수와 yield만 사용해 간단히 구현 가능 |
| 메모리 사용 | 모든 데이터를 미리 메모리에 올림 | 필요할 때만 데이터를 생성해 메모리 효율적 |
| 상태 관리 | 명시적으로 상태를 관리해야 함 | 자동으로 상태가 관리됨 |
제너레이터 응용: 무한 시퀀스
제너레이터는 무한 반복 시퀀스와 같은 메모리 효율적인 작업에 적합합니다.
def infinite_sequence():
number = 0
while True:
yield number
number += 1
# 무한 시퀀스 사용
for num in infinite_sequence():
if num > 10: # 10까지만 출력하고 중단
break
print(num) # 0, 1, 2, ..., 10 출력
언제 이터레이터와 제너레이터를 사용할까?
- 이터레이터
- 복잡한 상태 관리가 필요한 경우.
- 클래스 설계가 유용한 경우.
- 제너레이터
- 데이터 처리가 많아 메모리 효율성이 중요한 경우.
- 단순한 시퀀스를 생성할 때.

'Language > Python' 카테고리의 다른 글
| Python context manager (with의 동작 원리) (0) | 2023.10.29 |
|---|---|
| Python 데코레이터 (Decorators) (0) | 2023.10.28 |
| Python 예외 처리(Exception, try-except) (0) | 2023.10.26 |
| Python 모듈(module)과 패키지(package) (0) | 2023.10.25 |
| Python 객체지향 프로그래밍 (OOP) (0) | 2023.10.24 |