이터레이터 사용하기
- 이터레이터
- 반복할 수 있는 객체
- 문자열,리스트,딕셔너리,세트→요소가 여러 개 들어있고, 한 번에 하나씩 꺼낼 수 있는 객체
- 이터레이터 사용하는 이유
- for문은 어떤 요소를 조회할 때 처음부터 조회하고자 하는 요소까지 반복한다→반복문에서 꺼낼 요소들이 많아졌을 때 메모리를 많이 차지한다
- Iterator는 모든 요소에 대해 내부적으로 객체로 생성한 후에 순차적으로 조회하므로 조회하고자 하는 요소만 처음부터 반복하지 않고 뽑을 수 있다
- but, 속도면에서는 for문이 좋다
- dir(객체) 함수를 사용해서 객체의 메서드 확인→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 0x03616630>
- 리스트의 이터레이터를 변수에 저장한 뒤 next 메서드를 호출해보면 요소를 차례대로 꺼낼 수 있다
- 꺼낼 요소가 없으면 StopIteration 예외를 발생시켜서 반복을 끝냄
>>> 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
class Counter:
def __init__(self, stop):
self.current = 0
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.current < self.stop:
r = self.current
self.current += 1
return r
else:
raise StopIteration
for i in Counter(3):
print(i, end=' ')
0 1 2
class Counter:
def __init__(self, stop):
self.stop = stop
def __getitem__(self, index):
if index < self.stop:
return index
else:
raise IndexError
print(Counter(3)[0], Counter(3)[1], Counter(3)[2])
for i in Counter(3):
print(i, end=' ')
0 1 2
0 1 2
- 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