파이썬의 이터레이터

파이썬의 이터레이터

이 글에서는 파이썬의 이터레이터에 대해 설명합니다.

YouTube Video

파이썬의 이터레이터

개요

파이썬에서 이터레이터는 리스트, 튜플, 딕셔너리와 같은 컬렉션의 요소를 하나씩 처리하기 위한 기본적인 메커니즘입니다.

이터레이터란?

이터레이터는 요소를 하나씩 반환할 수 있는 객체입니다. 파이썬에서 객체가 이터레이터로 간주되기 위해서는 다음 두 가지 조건을 만족해야 합니다:.

  • __iter__() 메서드를 가지고 있으며, 이 메서드는 자기 자신을 반환합니다.
  • __next__() 메서드를 가지고 있으며, 이 메서드는 다음 요소를 반환합니다. 더 이상 요소가 없을 때 StopIteration 예외를 발생시킵니다.
1iterator = iter([1, 2, 3])
2print(next(iterator))  # 1
3print(next(iterator))  # 2
4print(next(iterator))  # 3
5# print(next(iterator))  # StopIteration occurs
  • 이 코드에서는 iter() 함수를 사용하여 리스트를 반복자(iterator)로 변환하고, next() 함수를 사용하여 각 요소를 하나씩 가져와 출력합니다.

이터러블과의 차이점

이터러블__iter__() 메서드를 구현하고 있어 for 반복문에서 사용할 수 있는 객체입니다. 리스트와 튜플이 대표적인 이터러블의 예입니다.

1nums = [10, 20, 30]
2it = iter(nums)  # Get an iterator from the iterable
3print(next(it))  # 10
  • 이 코드는 리스트와 같은 반복 가능한 객체(iterable)에서 반복자(iterator)를 얻고, next()로 순서대로 요소를 가져오는 예제입니다.

확인 방법:

1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable))  # True
7print(isinstance(nums, Iterator))  # False
8print(isinstance(it, Iterator))    # True
  • nums는 반복 가능 객체(iterable)이지만 반복자(iterator)는 아니며, iter(nums)로 얻은 it는 반복자임을 확인하는 코드입니다.

for 반복문과 이터레이터의 관계

파이썬의 for 반복문은 내부적으로 아래와 같이 동작합니다:.

1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4    try:
5        value = next(iterator)
6        print(value)
7    except StopIteration:
8        break
  • 보시다시피 for 반복문은 이터레이터를 암묵적으로 사용하여 순환을 수행합니다.

커스텀 이터레이터 만들기

클래스를 사용하여 커스텀 이터레이터를 만들 수 있습니다.

 1class Countdown:
 2    def __init__(self, start):
 3        self.current = start
 4
 5    def __iter__(self):
 6        return self
 7
 8    def __next__(self):
 9        if self.current <= 0:
10            raise StopIteration
11        value = self.current
12        self.current -= 1
13        return value
14
15for num in Countdown(3):
16    print(num)  # 3, 2, 1
  • 이 코드는 Countdown 클래스를 사용해 카운트다운하는 커스텀 반복자를 정의하고, for 루프를 사용하여 3부터 1까지 숫자를 출력합니다.

이터레이터와 제네레이터의 차이점, 그리고 사용 시기

제네레이터는 이터레이터와 유사한 기능을 제공합니다. 제네레이터를 사용하면 더 간결하게 이터레이터를 정의할 수 있습니다.

1def countdown(n):
2    while n > 0:
3        yield n
4        n -= 1
5
6for i in countdown(3):
7    print(i)  # 3, 2, 1
  • 이 코드는 yield를 사용해 카운트다운하는 제너레이터 함수를 정의하고, for 루프를 사용하여 3부터 1까지 숫자를 출력합니다.

이터레이터(클래스)와 제네레이터(함수)의 차이점

반복자(클래스)와 제너레이터(함수)에는 다음과 같은 차이점이 있습니다:.

특징 이터레이터(클래스) 제네레이터(함수)
정의 __iter__() + __next__() yield를 사용하는 함수
상태 관리 수동으로 속성 관리 필요 상태를 자동으로 유지
가독성 복잡해질 수 있음 단순하고 명확함
  • 정의 방식의 차이 이터레이터는 __iter__()__next__() 두 메서드를 직접 작성하여 정의됩니다. 반면, 제네레이터는 단순히 yield 키워드를 사용하는 함수로, 코드가 훨씬 간단해집니다.

  • 상태 관리의 차이 이터레이터는 현재 상태와 진행 상황을 변수로 직접 관리해야 합니다. 하지만 제네레이터는 파이썬이 내부적으로 상태를 자동으로 저장하기 때문에, 수동 관리의 필요성이 줄어듭니다.

  • 코드 가독성 이터레이터는 여러 메서드와 수동 상태 관리가 필요하기 때문에 코드가 복잡해지기 쉽습니다. 반면, 제네레이터는 단순한 문법을 사용하여 초보자도 쉽게 이해할 수 있습니다.

이터레이터를 위한 표준 라이브러리: itertools

파이썬의 표준 라이브러리인 itertools는 이터레이터를 다루기 위한 강력한 도구를 제공합니다.

1import itertools
2
3for x in itertools.count(10, 2):  # 10, 12, 14, ...
4    if x > 20:
5        break
6    print(x)
  • 또한 cycle, repeat, chain, islice, tee 등 다양한 함수도 포함되어 있습니다.

이터레이터의 활용 예시

반복자의 사용 예시는 다음과 같습니다:.

  • 파일의 각 줄 처리: 파일에서 한 줄씩 이터레이터로 읽기.
  • 메모리 효율적인 처리: 대량의 데이터를 순차적으로 처리하기.
  • 무한 시퀀스 표현: itertools.count() 같은 함수 활용하기.

요약

  • 이터레이터는 다음 값을 순차적으로 가져올 수 있는 객체입니다.
  • __iter__()__next__()를 정의하여 커스텀 이터레이터를 만들 수 있습니다.
  • for 반복문이나 next() 함수를 통해 자동으로 이터레이터가 처리됩니다.
  • 제네레이터나 itertools를 사용하면 더욱 효율적으로 데이터를 처리할 수 있습니다.

이터레이터를 사용하면 대량의 데이터를 메모리 효율적으로 순차 처리할 수 있으며, 상태 관리가 용이해지고 프로그램 성능도 향상됩니다.

위의 기사를 보면서 Visual Studio Code를 사용해 우리 유튜브 채널에서 함께 따라할 수 있습니다. 유튜브 채널도 확인해 주세요.

YouTube Video