안녕하세요. TDR입니다.
오늘은 python의 Iterator(반복자)에 대해서 간략히 정리해 보겠습니다.
Iterator는 python 외에도 왠만한 언어에는 모두 존재하는 개념으로 " 반복 가능한 객체로 "를 뜻합니다. 대표적인 collection으로 list(array), tuple, string 등이 있습니다. 간단한 예시를 보면 다음과 같습니다.
hello = 'Hello world'
it = hello.__iter__()
for i in range(len(hello)):
print(it.__next__())
## Result
# H
# e
# l
# l
# o
#
# w
# o
# r
# l
# d
위의 예시와 같이 <반복 가능 객체>.__iter__()를 이용하여 iterator 객체를 얻을 수 있습니다. 그리고 iterator_object.__next__()를 통해 값을 순차적으로 하나씩 꺼내올 수 있습니다. 참고로, range()도 iterator 객체를 반환하는 함수입니다. 위에서는 string 길이 만큼 출력을 해서 문제가 없었는데 만약 모든 값을 모두 출력한 iterator 객체에 다시 __next__()를 호출하면 어떻게 될까요? 그럴경우 StopIteration Exception이 발생합니다.
__iter__()과 같은 형태를 매직 메서드(magic method)라고 부르는데 직접 사용해도 무방하나 일반적으로는 가시성이나 편의성을 위해 내장 함수인 iter() 형태를 주로 씁니다. 위의 예제 코드는 아래 예제 코드와 완벽하게 동일한 코드입니다.
hello = 'Hello world'
it = iter(hello)
for i in range(hello.__len__()):
print(next(it))
__iter__(), __next__()를 내장 함수로 바꿨고, len()를 매직 메서드로 변경하였습니다. next() 내장 함수는 __next__()와 다른 한가지 기능이 있습니다. 그건 next(it, <end_of_iterator>)와 같이 작성을 해서 StopIteration을 발생 시키는 대신 <end_of_iterator>를 출력하게 하는 것이 가능합니다.
그러면 반복 가능한 객체의 조건이 뭔지 알아보겠습니다.
쉽게 생각하면 "반복"한다는 것은 동일한 방법으로 다음 값을 부를 수 있으면 반복 된다고 말할 수 있을 것 같습니다. 실제로도 next()를 통해 다음 값을 불러오고 있고요. python에서는 반복 가능한 객체란 __iter__()와 __next__()를 구현한 객체를 뜻합니다. 간단한 예제를 살펴 보겠습니다.
class Fruits:
fruits_list = ['apple', 'orange', 'banana', 'water melon', 'melon']
fruits_len = len(fruits_list)
def __init__(self, count):
print('init')
self.count = count
def __iter__(self):
print('iter')
return self
def __next__(self):
print('next')
if self.count > 0:
result = self.fruits_list[self.fruits_len - self.count]
self.count -= 1
return result
else:
raise StopIteration
for i in Fruits(4):
print(i)
## Result ##
init
iter
next
orange
next
banana
next
water melon
next
melon
next
Fruits라는 class에는 __init__, __iter__, __next__ 함수를 구현했습니다. 개수를 받아서 미리 정의 해 놓은 fruits_list로 부터 몇개를 출력하는지에 대한 간단한 예제입니다. 마치 range()와 같이 동작하는 것을 볼 수 있습니다.
출력 부분을 보면, 당연히 __init__이 가장 먼저 호출이 되고 그 이후에 __iter__이 호출되는 것을 볼 수 있습니다. 이건 for문의 동작 방식이 __iter__을 호출하여 iterator 객체를 받아온 후, __next__를 통해서 값을 하나씩 받아 온다는 것을 알 수 있습니다.
iterator의 추가적인 내용은 다음에 이어서 정리해 보겠습니다. (아래 링크 참조)
'Computer & Program > python' 카테고리의 다른 글
[python] Generator(발생자) (0) | 2024.03.04 |
---|---|
[python] Iterator(반복자) - 02 (0) | 2024.03.03 |
[python] Decorator(데코레이터) - 02 (0) | 2024.03.01 |
[python] Decorator(데코레이터) - 01 (0) | 2024.02.29 |
[python] Assert(어설트) (2) | 2024.02.28 |
댓글