파이썬에서 기본 이터레이터를 만드는 방법

파이썬에서 이터레이터는 기본 데이터 구조와 직접 작업할 필요 없이 값의 컬렉션을 탐색할 수 있게 해주는 강력한 도구입니다. 리스트, 집합 또는 사용자 정의 객체를 다루든, 자신만의 이터레이터를 만드는 방법을 이해하는 것은 매우 유익할 수 있습니다.

이 블로그 포스트에서는 Example이라는 예제 클래스를 사용하여 기본 이터레이터를 만드는 방법을 설명하고, 그 다음에 생성자를 사용한 더 간단한 구현을 살펴보겠습니다.

이터레이터란 무엇인가?

이터레이터는 이터레이터 프로토콜을 따르는 객체입니다. 즉, 두 가지 필수 메소드를 제공해야 합니다.

  1. __iter__(): 이 메소드는 이터레이터 객체 자체를 반환합니다.
  2. __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의 이터레이터 및 간단한 생성자에 대한 기사를 확인해 보시기 바랍니다.

이제 파이썬에서 이터레이터를 만드는 방법에 대한 기본 이해가 생겼으니, 자신의 프로젝트에 이러한 개념을 적용할 수 있습니다!