본문 바로가기
Computer & Program/python

[python] Iterator(반복자) - 01

by TDRemon 2024. 3. 2.
반응형

안녕하세요. 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의 추가적인 내용은 다음에 이어서 정리해 보겠습니다. (아래 링크 참조)

 

[python] Iterator(반복자) - 02

안녕하세요. TDR입니다. 저번 시간에 이어서 iterator에 대해서 정리해보겠습니다. https://tdremon.tistory.com/entry/python-Iterator%EB%B0%98%EB%B3%B5%EC%9E%90 iterator의 특징 중에 하나가 unpacking(언패킹)도 가능하다

tdremon.tistory.com

반응형

'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

댓글