이제 이 함수는 어떤 값도 반환하지 않는다. 대신 값 n을 산출하고, 실행을 보류하고, 내부 상태를 저장한다. 하지만 변경된 함수 make_evens_gen은 반환값을 가지고 있다! 그림 4-4에서 살펴보았듯이, 반환값은 n이 아니라 ‘제너레이터 객체’라고 불리는 이터레이터 객체다. make_evens_gen을 호출하여 반환값이 무엇인지 확인해 보자.
>>> make_evens_gen()
<generator object make_evens_gen at 0x1068bd410>
함수가 어떻게 동작했는가? n을 위한 값을 산출했는가? 그렇지 않다. 대신 이터레이터 객체를 반환했고, 그 객체가 값을 산출하게 된다. 이제 우리는 이터레이터 객체(혹은 제너레이터 객체)를 변수에 저장하여 next에 넘겨줄 수 있다.
>>> my_gen = make_evens_gen()
>>> next(my_gen)
2
>>> next(my_gen)
4
>>> next(my_gen)
6
마침내 시퀀스의 끝에 도달하면 StopIteration 예외가 발생한다. 만약 시퀀스의 처음으로 되돌아가고 싶다면 어떻게 해야 할까? 어렵지 않다. make_evens_gen을 다시 호출한 후 신규 이터레이션 인스턴스를 생산하면 된다. 그렇게 되면 처음부터 시작하게 된다.