파이썬에서 기본 이터레이터
를 만드는 방법
파이썬에서 이터레이터는 기본 데이터 구조와 직접 작업할 필요 없이 값의 컬렉션을 탐색할 수 있게 해주는 강력한 도구입니다. 리스트, 집합 또는 사용자 정의 객체를 다루든, 자신만의 이터레이터를 만드는 방법을 이해하는 것은 매우 유익할 수 있습니다.
이 블로그 포스트에서는 Example
이라는 예제 클래스를 사용하여 기본 이터레이터를 만드는 방법을 설명하고, 그 다음에 생성자를 사용한 더 간단한 구현을 살펴보겠습니다.
이터레이터란 무엇인가?
이터레이터는 이터레이터 프로토콜을 따르는 객체입니다. 즉, 두 가지 필수 메소드를 제공해야 합니다.
__iter__()
: 이 메소드는 이터레이터 객체 자체를 반환합니다.__next__()
: 이 메소드는 컬렉션에서 다음 값을 반환합니다. 반환할 항목이 더 이상 없으면StopIteration
예외를 발생시킵니다.
이 메소드들은 루프에서 요소를 반복하는 데 용이합니다.
기본 이터레이터 만들기
이터레이터를 단계별로 만드는 방법을 알아보겠습니다.
1단계: 클래스 정의하기
먼저 Example
이라는 클래스를 정의하겠습니다. 이 클래스는 값의 리스트를 받아 이를 이터레이터를 통해 노출합니다.
class Example:
def __init__(self, values):
self.values = values
2단계: 이터레이터 메소드 구현하기
이제 Example
클래스에 __iter__
및 __next__
메소드를 구현하겠습니다.
class Example:
def __init__(self, values):
self.values = values
def __iter__(self):
self.index = 0 # 인덱스 초기화
return self
def __next__(self):
if self.index < len(self.values):
result = self.values[self.index]
self.index += 1 # 다음 인덱스로 이동
return result
else:
raise StopIteration # 더 이상 반환할 값이 없음
3단계: 이터레이터 사용하기
이제 Example
의 인스턴스를 생성하고 그 값을 다음과 같이 반복할 수 있습니다.
e = Example([1, 2, 3])
for value in e:
print("예제 객체는", value, "를 포함하고 있습니다.")
이 코드는 다음과 같은 출력을 생성합니다:
예제 객체는 1 를 포함하고 있습니다.
예제 객체는 2 를 포함하고 있습니다.
예제 객체는 3 를 포함하고 있습니다.
카운터 이터레이터 만들기
개념을 더 잘 설명하기 위해, 주어진 낮은 숫자부터 높은 숫자까지 세는 간단한 Counter
이터레이터를 만들어 보겠습니다.
카운터 클래스
다음과 같이 Counter
이터레이터를 생성할 수 있습니다:
class Counter:
def __init__(self, low, high):
self.current = low - 1
self.high = high
def __iter__(self):
return self
def __next__(self):
self.current += 1
if self.current < self.high:
return self.current
raise StopIteration
카운터 사용하기
다음과 같이 Counter
클래스를 사용할 수 있습니다:
for c in Counter(3, 9):
print(c)
이것은 다음과 같은 결과를 출력합니다:
3
4
5
6
7
8
대안 접근법: 생성자 사용하기
위의 이터레이터 클래스들이 유용하지만, 생성자를 구현하면 훨씬 간단할 수 있습니다. 생성자는 상태 및 이터레이션 프로토콜을 자동으로 처리해줍니다.
다음은 카운터를 생성자로 만드는 방법입니다:
def counter(low, high):
current = low
while current < high:
yield current
current += 1
for c in counter(3, 9):
print(c)
출력은 동일하지만, 생성자 접근법은 코드를 더 깔끔하고 유지보수하기 쉽게 만들어줍니다.
결론
파이썬에서 이터레이터를 만드는 것은 자신만의 루프 동작을 정의하고 객체가 값을 노출하는 방식을 조작할 수 있게 해줍니다. __iter__()
및 __next__()
메소드를 구현함으로써, 사용자 정의 반복 경험을 제공할 수 있습니다. 또한, 생성자를 사용하면 이 과정을 단순화할 수 있어 시간 절약과 복잡성 감소에 도움이 됩니다.
이 주제에 대해 더 읽고 싶다면, David Mertz의 이터레이터 및 간단한 생성자에 대한 기사를 확인해 보시기 바랍니다.
이제 파이썬에서 이터레이터를 만드는 방법에 대한 기본 이해가 생겼으니, 자신의 프로젝트에 이러한 개념을 적용할 수 있습니다!