Python
Iterator
#Ubuntu 16.04 LTS
#Python 3.5.2
이터레이터?
값을 차례대로 꺼낼 수 있는 객체로 반복자라고도 불린다.
만약 연속한 숫자를 미리 만들면 숫자가 적을 때는 상관없지만 숫자가 아주 많을 때는 메모리를 많이 사용하므로 성능에 불리하다.
그래서 파이썬에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용하는데 이를 지연 평가( lazy evaluation )라고 한다.
반복 가능한 객체 = 이터레이터 ?
결론 부터 이야기하면 단순히 반복만 가능한 객체는 이터레이터가 아니다.
1. 반복 가능한 객체
반복 가능한 객체는 요소가 여러개 들어 있고, 한 번에 값을 하나씩 꺼낼 수 있는 객체로 문자열, 리스트, 딕셔너리 등등이 있다.
객체가 반복 가능한 객체 인지 알아보려면 객체 안에 __iter__ 메소드가 정의되어 있는지 확인하면 된다.
$ dir(객체명) 을 이용하면 객체의 메소드를 확인 할 수 있다.
2. 이터레이터
__next__ 메소드를 사용해서 차례대로 값을 꺼낼 수 있는 객체
이터레이터의 __next__ 메소드를 사용해서 값을 하나씩 가져오다가 값을 모두 다 가져오면 StopIteration 예외를 발생시킨다.
즉, 반복 가능한 객체에서 __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일
- 함수의 결과를 변수 여러개에 할당할 수 있는 것. a, b, c = rang(3) 단, 이터레이터가 반복하는 횟수와 변수의 개수는 동일하게 맞춰주어야 합니다. [본문으로]
'개발자 레니는 지금 - > 소프트웨어와 함께' 카테고리의 다른 글
[ MODULE ] audioop:: pcm data 모노, 스테레오 정보 바꾸기 (0) | 2018.07.16 |
---|---|
[ BASIC ] 발생자 제네레이터 (0) | 2018.07.16 |
[ MODULE ] boto3:: aws api (0) | 2018.07.16 |
[ DO ] 파이썬 마이크 입력 코드 (0) | 2018.07.16 |
[ BASIC ] PEP8 - Style Guide for Python Code (0) | 2018.07.16 |