순차적으로 참조는 하나, 인덱싱에 의한 순서적인 참조가 의미 없는 경우를 보완하기 위해 반복자(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
Posted by scii
: