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)

Category:programming
Tags:python

comments powered by Disqus