본문 바로가기
AI/파이썬

파이썬(Python) - Iterator 사용하기

by 알푼 2023. 5. 30.
728x90
728x90

Iterator란?


Iterator는 값을 차례대로 꺼낼 수 있는 객체(Object)이다. 예를 들어

for i in range(100):

구문에서는 0~99 까지의 연속된 숫자를 보여주는데, 사실 숫자를 모두 만드는 것이 아니라 0~99 까지 값을 차례대로 꺼낼 수 있는 iterator를 만든 후 이를 반복하면서 숫자를 하나씩 꺼내는 것이다.

만약 연속된 숫자를 미리 만들면 숫자가 적을 때는 상관 없지만, 아주 많을 때는 메모리를 많이 사용하게 되어 성능에 불리해진다. 그래서 파이썬에서는 iterator만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용한다. 즉, 데이터 생성을 뒤로 미루는 것이며 이러한 방식을 지연 평가 (lazy evaluation) 이라고 한다.

 

Iterable이란?


Iterable은 반복 가능한 객체이며, 우리가 흔히 사용하는 문자열, 리스트, 딕셔너리, 세트가 반복 가능한 객체 (Iterable) 이다. 즉, 요소가 여러 개 들어있고 한 번에 하나씩 꺼낼 수 있는 객체이다. 이를 알아보려면 객체에 __ iter __ 메서드가 들어있는지 확인해보면 된다. 아래는 [1, 2, 3]의 “리스트”를 “dir” 함수를 사용하여 확인하는 방법이다.

>>> 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 __ 메서드가 들어 있다. 이 리스트에서 __ iter __ 를 호출해보면 iterator가 나온다.

>>> [1, 2, 3].__iter__()
<list_iterator object at 0x03616630>

이 리스트의 __ iter __ 메서드를 통해 it이라는 변수에 저장한 후 __ next __ 메서드를 호출하면 리스트 안에 있는 요소를 하나씩 차례대로 꺼낼 수 있다.

>>> it = [1, 2, 3].__iter__()
>>> it.__next__()
1
>>> it.__next__()
2
>>> it.__next__()
3
>>> it.__next__()
Traceback (most recent call last):
  File "<pyshell#48>", line 1, in <module>
    it.__next__()
StopIteration

마지막 요소가 출력 된 이후에 __ next __ 메서드를 또 호출하면 StopIteration이 출력되는데, 더이상 꺼낼 요소가 없어서 예외를 발생시켜 반복을 끝내는 것이다.


▶ 정리하면 iterable은 요소를 한 번에 하나씩 가져올 수 있는 object이고, iterator는 __ next __ 메서드를 사용해서 차례대로 값을 꺼낼 수 있는 object이다. Iterable과 Iterator는 별개의 object 이므로 구분해야 한다.

내장함수 (iter ,next)


파이썬의 내장함수 iter는 __ iter __ 메서드를 호출해주고, next는 __ next __ 메서드를 호출해준다.

>>> it = iter(range(3))
>>> next(it)
0
>>> next(it)
1
>>> next(it)
2
>>> next(it)
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    next(it)
StopIteration

__ iter __ , __ next __ 메서드를 사용한 위의 예와 동일한 결과임을 확인할 수 있다.

728x90
반응형

댓글