이터레이터 개념
이터레이터는 값을 차례대로 꺼낼 수 있는 객체(object)이다.
만약, 연속된 숫자를 미리 만들면 숫자가 적을 때는 상관없지만 많을 때는 메모리를 많이 사용 하게 된다. 따라서 성능에 불리하다. 그래서 파이썬에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용한다.
이터레이터를 사용할 수 있는 객체는 반복 가능한 객체(iterable)이고, iterable 객체에는 문자열
, 리스트
, 딕셔너리
, 세트
가 있다.
객체가 반복가능한 객체인지 알아보는 방법은 객체에 __iter__
메서드가 들어있는지 확인하면 된다.
이터레이터 만들기
it = [1, 2, 3].__iter__()
it.__next()__
it.__next()__
it.__next()__
it.__next()__
- 리스트의 이터레이터를 변수에 저장한다.
- 이터레이터 변수로 next() 메서드를 호출하여, 요소를 차례대로 꺼낸다.
- next() 를 계속 호출하여 요소를 다 꺼낸 후, 다시 호출하면 StopIteration 예외를 발생시켜서 반복을 끝낸다.
r = range(3).__iter__()
r.__next__()
- 위의 예와 같이 반복 가능한 객체는 __iter__ 메서드로 이터레이터를 얻고, 이터레이터의 __next__ 메서드로 반복한다.
- 클래스에 __iter__, __next__ 메서드를 모두 구현하면 이터레이터를 만들 수 도 있다.
- __iter__, __next__를 가진 객체를 이터레이터 프로토콜(iterator protocol)을 지원한다고 말한다.
- __getitem__ 메서드를 구현하면 인덱스로 접근할 수 있는 이터레이터가 된다.
next() 기본값 지정하기
기본값을 지정하면 반복이 끝나더라도 StopIteration이 발생하지 않고 기본값을 출력한다.
반복 가능한 객체와 이터레이터의 차이점
*반복 가능한 객체(iterable): 요소를 한 번에 하나씩 가져올 수 있는 객체
*이터레이터(iterator): __next__ 메서드를 사용해서 차례대로 값을 꺼낼 수 있는 객체
- 즉, iterable 에서 __iter__ 메서드로 이터레이터를 얻을 수 있다.
- 클래스에 iter, next 메서드를 구현하면 이터레이터가 된다.
시퀀스 객체와 반복 가능한 객체의 차이
- 리스트, 튜플, range, 문자열은 반복 가능한 객체이면서 시퀀스 객체이다.
- 딕셔너리와 세트는 반복 가능한 객체이지만 시퀀스 객체는 아니다. 그 이유는 시퀀스 객체는 요소의 순서가 정해져 있고 연속적(sequence)으로 이어져 있어야 하는데, 딕셔너리와 세트는 요소(키)의 순서가 정해져 있지 않기 때문이다.