파이썬(Python) 제너레이터와 이터레이터
파이썬(Python)에서 제너레이터와 이터레이터는 메모리를 효율적으로 사용하면서 반복 가능한 객체를 생성하는 강력한 도구입니다. 이 글에서는 이터레이터와 제너레이터의 기본 개념부터 실제 사용 예제까지 다루어 보겠습니다.
1. 이터레이터란?
이터레이터는 반복 가능한 객체를 순차적으로 접근할 수 있는 객체입니다. 이터레이터 객체는 __iter__()
와 __next__()
메서드를 구현해야 합니다. 예를 들어:
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
# 사용 예제
my_iter = MyIterator([1, 2, 3])
for item in my_iter:
print(item)
2. 제너레이터란?
제너레이터는 이터레이터를 생성하는 간편한 방법입니다. 제너레이터 함수는 yield
키워드를 사용하여 값을 하나씩 반환합니다. 예를 들어:
def my_generator():
yield 1
yield 2
yield 3
# 사용 예제
for item in my_generator():
print(item)
제너레이터는 호출될 때마다 이전 상태를 기억하고, 다음 yield
문에서 실행을 재개합니다.
3. 이터레이터와 제너레이터의 차이점
이터레이터와 제너레이터는 모두 반복 가능한 객체를 생성하는 데 사용되지만, 구현 방식에 차이가 있습니다. 이터레이터는 클래스 형태로 __iter__()
와 __next__()
메서드를 구현해야 하지만, 제너레이터는 함수 형태로 yield
키워드를 사용해 간단히 구현할 수 있습니다.
4. 제너레이터 함수와 제너레이터 표현식
제너레이터 함수는 yield
키워드를 사용해 값을 반환하는 함수입니다. 제너레이터 표현식은 제너레이터를 생성하는 간단한 문법으로, 리스트 컴프리헨션과 비슷한 형태를 가집니다. 예를 들어:
# 제너레이터 함수
def my_generator():
for i in range(4):
yield i
# 제너레이터 표현식
my_gen_exp = (x * x for x in range(4))
# 사용 예제
print(list(my_generator())) # [0, 1, 2, 3]
print(list(my_gen_exp)) # [0, 1, 4, 9]
5. 실전 예제: 파일 읽기와 데이터 처리
제너레이터를 사용하면 대용량 파일을 효율적으로 읽고 처리할 수 있습니다. 예를 들어:
def read_large_file(file_path):
with open(file_path, 'r') as file:
for line in file:
yield line.strip()
# 사용 예제
for line in read_large_file('large_file.txt'):
print(line)
이 예제에서는 파일의 각 줄을 제너레이터로 처리하여 메모리 사용을 최소화합니다.
6. 결론
파이썬(Python)에서 제너레이터와 이터레이터는 반복 가능한 객체를 효율적으로 생성하고 처리하는 데 유용한 도구입니다. 제너레이터를 사용하면 간결하고 메모리 효율적인 코드를 작성할 수 있으며, 이터레이터를 통해 커스텀 반복 동작을 정의할 수 있습니다. 제너레이터와 이터레이터의 개념을 이해하고 다양한 상황에서 활용해 보세요.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
파이썬 컨텍스트 매니저, 자동 자원 관리의 핵심 (0) | 2024.08.13 |
---|---|
파이썬(Python) 데코레이터, 함수 장식과 재사용성 증가 (0) | 2024.08.12 |
파이썬 함수형 프로그래밍 구현하기, 고차 함수와 불변성 (0) | 2024.08.10 |
파이썬(Python) 캡슐화, 접근 제어와 정보 은닉 (0) | 2024.08.09 |
파이썬(Python) 다형성, 메서드 오버라이딩과 인터페이스 (0) | 2024.08.08 |