-
파이썬 - 이터레이터python 2021. 3. 18. 21:55
이터레이터(Iterator)는 값을 차례대로 꺼낼 수 있는 객체다. 파이썬에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용한다. 이 행위는 데이터 생성을 뒤로 미루는 것인데 이런 방식을 지연 평가(lazy evaluation)이라고 한다. 이터레이터는 반복자라고 부르기도 한다. 출처: 코딩도장
요소가 여러 개 들어있고, 한 번에 하나씩 꺼낼 수 있는 객체를 반복 가능한 객체라고 한다. 흔히 사용하는 문자열, 리스트,딕셔너리 등이 반복 가능한 객체다.
객체가 반복 가능한지 알기 위해선 객체에 __iter__ 메서드가 있는지 확인해보면 된다.
>>> dir([1,2,3]) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] >>> [1,2,3].__iter__() <list_iterator object at 0x000001FC4F0428E0>
리스트의 이터레이터를 변수에 저장한뒤 __next__메서드를 호출해서 요소를 차례대로 꺼낼 수 있다. 모두 꺼낸 이후 더 이상 꺼낼 요소가 없으면 Stopiteration 예외를 발생시켜서 반복을 끝낸다.
>>> it = [1,2,3].__iter__() >>> it.__next__() 1 >>> it.__next__() 2 >>> it.__next__() 3 >>> it.__next__() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
>>> it = range(3).__iter__() >>> it.__next__() 0 >>> it.__next__() 1 >>> it.__next__() 2 >>> it.__next__() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
반복 가능한 객체는 __iter__ 메서드로 이터레이터를 얻고, 이터레이터의 __next__ 메서드로 반복한다. 여기서는 반복 가능한 객체와 이터레이터가 분리되어 있지만 클래스에 __iter__와 __next__ 메서드를 모두 구현하면 이터레이터를 만들 수 있다. 특히 __iter__, __next__를 가진 객체를 이터레이터 프로토콜(iterator protocol)을 지원한다고 말한다.
정리하자면 반복 가능한 객체는 요소를 한 번에 하나씩 가져올 수 있는 객체이고, 이터레이터는 __next__ 메서드를 사용해서 차례대로 값을 꺼낼 수 있는 객체다. 반복 가능한 객체(iterable)와 이터레이터(iterator)는 별개의 객체이므로 둘은 구분해야 한다. 즉, 반복 가능한 객체에서 __iter__ 메서드로 이터레이터를 얻는다.
이터레이터 만들기
__iter__, __next__ 메서드를 구현해서 직접 이터레이터를 만들 수 있다.
class 이터레이터이름: def __iter__(self): 코드 def __next__(self): 코드
class Counter: def __init__(self, stop): self.current = 0 # 현재 숫자 유지, 0부터 지정된 숫자 직전까지 반복 self.stop = stop # 반복을 끝낼 숫자 def __iter__(self): return self # 현재 인스턴스를 반환 def __next__(self): if self.current < self.stop: # 현재 숫자가 반복을 끝낼 숫자보다 작을 때 r = self.current # 반환할 숫자를 변수에 저장 self.current += 1 # 현재 숫자를 1 증가시킴 return r # 숫자를 반환 else: # 현재 숫자가 반복을 끝낼 숫자보다 크거나 같을 때 raise StopIteration # 예외 발생 for i in Counter(3): print(i, end=' ')
#실행 결과 012
'python' 카테고리의 다른 글
파이썬 - 제너레이터 / 데커레이터 (0) 2021.03.19 파이썬 - docstring (0) 2021.03.19 파이썬 - 람다 함수 (0) 2021.03.16 파이썬 - 인수(argument) (0) 2021.03.16 클래스 - 메서드 오버라이딩과 다형성 (0) 2021.03.11