본문 바로가기

개발자 레니는 지금 -/소프트웨어와 함께

[ BASIC ] 반복자 이터레이터


Python

Iterator

#Ubuntu 16.04 LTS

#Python 3.5.2



이터레이터?

값을 차례대로 꺼낼 수 있는 객체로 반복자라고도 불린다.


만약 연속한 숫자를 미리 만들면 숫자가 적을 때는 상관없지만 숫자가 아주 많을 때는 메모리를 많이 사용하므로 성능에 불리하다.

그래서 파이썬에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용하는데 이를 지연 평가( lazy evaluation )라고 한다.


반복 가능한 객체 = 이터레이터 ?

결론 부터 이야기하면 단순히 반복만 가능한 객체는 이터레이터가 아니다.


1. 반복 가능한 객체

반복 가능한 객체는 요소가 여러개 들어 있고, 한 번에 값을 하나씩 꺼낼 수 있는 객체로 문자열, 리스트, 딕셔너리 등등이 있다.

객체가 반복 가능한 객체 인지 알아보려면 객체 안에 __iter__ 메소드가 정의되어 있는지 확인하면 된다.


$ dir(객체명) 을 이용하면 객체의 메소드를 확인 할 수 있다.


2. 이터레이터

__next__ 메소드를 사용해서 차례대로 값을 꺼낼 수 있는 객체

이터레이터의 __next__ 메소드를 사용해서 값을 하나씩 가져오다가 값을 모두 다 가져오면 StopIteration 예외를 발생시킨다.

언패킹( unpacking )[각주:1]이 가능합니다.


즉, 반복 가능한 객체에서 __iter__ 메소드로 이터레이터를 얻어서 __next__ 메소드를 사용해서 차례대로 값을 꺼내는 것 입니다.


실제로 list를 만들어 dic() 로 정의된 함수를 출력해 보면 __iter__ 메소드만 보입니다.

iterator = list.__iter__() 로 이터레이터 객체를 얻어와서 iterator.__next__() 를 호출하면 리스트의 값을 차례대로 불러옵니다.


구현방법

이터레이터 객체를 구현하는 방법은 크게 2가지가 있는데,

1번 방법과 2번 방법의 차이는 index로 접근을 할 수 있냐 없냐로 구분된다.


1. class 안에 __iter__과 __next__ 메소드를 구현

def __iter__(self): 현재 인스턴스 또는 __iter__를 호출할 반복 가능한 객체를 정의합니다.

def __next__(self): 조건에 따라 값을 만들어 내거나 StopIteration 예외를 발생시킵니다.


2. class 안에 __getitem__ 메소드를 구현

det __getitem__(self, index): 조건에 따라 값을 만들어 내거나 IndexError 예외를 발생시킨다.


iter(), next() 활용하기

iter()과 next()는 Python 내장 함수로써, 이들을 이용해 이터레이터를 사용할 수 있습니다.

구현은 아니라 단지 사용하게 하는 것이기 때문에 따로 정리합니다.


1. iter(): 객체의 __iter__ 메소드를 호출하고 반복을 끝낼 때 StopIteration 예외를 발생한다.

2. next(): 객체의 __next__ 메소드를 호출해 준다.


때문에 iter()로 이터레이터 객체를 생성하고 나서 그 이터레이터 객체를 next()를 이용함으로써 값을 가지고 옵니다.

사실상 맨 위에서 살펴보았던 __iter__(), __next()__과 동작은 같지만 틀린 점이 있습니다.


1. iter(호출가능한 객체, 반복을 끝낼 값)

객체 내부의 __iter__() 메소드를 호출할 때와 달리 반복을 끝낼 값을 설정할 수 있다.

이때, 호출 가능한 객체는 매개변수가 없는 함수 또는 람다 표현식으로 만들어야 한다.

예를 들면, iter(lambda : random.randint(0, 5), 2)

0부터 5까지 무작위로 숫자를 생성할 때 반복을 끝낼 값( 2 )가 나오면 반복을 끝내도록( StopIteration 발생 )만들 수도 있습니다.


2. next(이터레이터, StopIteration발생시 기본값)

iter()로 반복을 끝낼 값을 설정하거나 반복이 끝나는 지점에 도착 시 next는 StopIteration 대신 설정해 놓은 기본값을 반환합니다.

예를 들면, it = iter(range(3)) / next(it, 0)

0부터 5까지 무작위로 숫자를 생성할 때 반복이 끝나면( 0, 1, 2 모두 출력 후) 기본값 ( 0 )을 출력합니다.





#2018년07월17일

  1. 함수의 결과를 변수 여러개에 할당할 수 있는 것. a, b, c = rang(3) 단, 이터레이터가 반복하는 횟수와 변수의 개수는 동일하게 맞춰주어야 합니다. [본문으로]