반복자(Iterator)
Programming/Python 2013. 5. 9. 02:14 |순차적으로 참조는 하나, 인덱싱에 의한 순서적인 참조가 의미 없는 경우를 보완하기 위해 반복자(Iterator)가 만들어졌다.
반복자 객체의 특성
# 반복자 객체는 iter() 내장 함수로 만들어진다.
# 반복자 객체는 next() 메소드를 가진다. next() 메소드를 가지는 객체가 반복자 객체이다.
# 반복자 객체가 next() 메소드로 더 이상 자료를 넘겨줄 수 없는 경우에는 StopIteration 예외를 발생한다.
클래스에 반복자 구현하기
이와 같이 순차적으로 참조되어야 할 정보는 반복자로 구현되는 것이 타당하다.
사전의 반복자
iterkeys, itervalues, iteritems 메소드는 키, 값 혹은 (키, 값) 튜플의 반복자를 리턴한다.
keys(), values(), items() 메소드를 이요해서 리스트로 된 자료를 얻은 후에 for 루프를 돌릴 수도 있지만 iterkeys(), itervalues(), iteritems() 메소드를 이용하면 요구된 시점에서 원하는 자료를 그때 그때 만들어서 넘겨주므로 리스트를 미리 구성해야 하는 부담이 없다.
또 언제든지 루프를 중단할 때는 나머지 데이터에 대한 참조를 하지 않아도 되므로 더 효율적인 수행이 가능하다.
파일 객체의 반복자
파일 객체가 라인 단위의 반복자를 지원한다. 앞서 Seq 와 같은 클래스를 만들 필요가 없다.
호출 가능한 객체에 반복자 적용하기
호출 가능한 객체(callable) 에 반복자를 적용할 수 있다.
C언어에는 다음과 같은 구조가 있다. (엔터 키만 입력 받으면 Null을 리턴)
while((line = readline()) != NULL)
{
printf(line);
}
이러한 구조를 파이썬으로 구현하기는 쉽지 않은데, 다음과 같이 하면 가능하다.
for line in iter(raw_input, ''):
print line
호출되는 함수가 인수를 받을 경우에는 위와 같은 방법으로는 안된다. 이 경우는 람다 함수를 이용하면 쉽게 해결 된다.
lambda:accum(sum, 2) 와 같이 lamda: 다음에 원하는 함수를 호출해 주면 된다. 매번 함수를 호출한 결과 값은 sum이 받을 것이며, 이 값은 40 과 비교되어 값이 같으면 루프를 종료한다.
itertools 모듈
이 모듈은 반복 가능한 객체(시퀀스, 반복자, 발생자등) 의 반복자(혹은 발생자)를 생성하는 몇 개의 함수로 구성되어 있다.
이들 함수는 메모리와 계산 시간에서 효과적인 연산이 가능하도록 많은 도움을 준다. 반복자가 효과적인 이유는 자료가 욕구될 때 필요한 시점에서 자료를 준비해서 리턴하기 때문이다.
여기에 설명되는 함수들은 자료의 크기가 크면 클수록 더욱 그 효과를 발휘한다.
chain(*iterables) 함수는 객체에서 자료를 연속해서 하나씩 넘겨준다.
l1, l2에 대해 연속된 데이터를 넘겨준다.
이 방법은 새로운 리스트를 생성하므로 메모리를 낭비한다.
groupby(iterable[, key]) 는 자료를 그룹 단위로 묶는 데 사용된다. key 함수가 주어지지 않았을 경우는 요소 자료 자체가 키 값이 된다.
인수가 정렬되어야 인접한 자료를 한 그룹으로 묶는다.
두 번째 자료를 기준으로 그룹화하려면 다음과 같이 할 수 있다.
itemgetter(1) 은 어떤 객체의 [1] 요소 값을 취하는 함수이다. 즉, lambda x:x[1] 과 같은 함수이다.
다음 예는 문장의 단어가 몇 번 반복되는가를 출력한다.
'Programming > Python' 카테고리의 다른 글
Multithread Process (0) | 2013.05.12 |
---|---|
발생자(Generator) (0) | 2013.05.09 |
class 메소드 관련 (0) | 2013.05.08 |
협동적 메소드와 super() (0) | 2013.05.07 |
연산자 오버로딩 (0) | 2013.05.02 |