2012-04-16
Python Iterator vs. Generator
iterator
임의의 sequence 를 순회하는데 필요한 정보를 담은 오브젝트.
iter() 함수를 통해서 생성하고, next() 함수를 이용해서 index 를 증가시켜서 다음 객체를 리턴한다. 맨 끝에 도달하면 StopIteration 예외를 던진다.
즉 for x in seq 는 내부적으로 아래와 같다.
it = iter(seq)
while 1:
try:
x = it.next()
except StopIteration:
break
임의의 클래스에 iter() 과 next() 함수를 정의하면, in 연산자로 iteration 이 가능하다.
class MyCollection:
def __init__(self, seq): self.idx=0; self.seq=seq
def __iter__(self): return self
def next(self):
if self.idx > len(self.seq): raise StopIteration
self.idx += 1
return self.seq[self.idx]
generator function
iterator 가 next() 호출을 통해서 값을 "리턴"하는 것과 달리, generator 는 next() 함수를 부르면 이전에 멈춘 곳부터 실행(resume)하다가 yield로 값을 리턴하고 다시 멈춤(pause)으로써, 결과적으로 값을 순차적으로 "생성"한다. 맨 끝에서는 역시 StopIteration 예외를 던진다.
generator expression
(x for x in seq)
처럼 [] 대신 () 로 list comprehension 을 묶으면 generator 를 간단히 만들 수 있다.
리스트를 파라미터로 받는 함수에 그대로 넘길 수도 있다.
sum(x for x in seq)