파이썬의 이터레이터
이 글에서는 파이썬의 이터레이터에 대해 설명합니다.
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를 사용해 우리 유튜브 채널에서 함께 따라할 수 있습니다. 유튜브 채널도 확인해 주세요.