[파이썬][제너레이터 사용하기] yield

2020. 1. 7. 15:04프로그래밍/파이썬 Python

제너레이터 사용하기

제너레이터는 이터레이터를 생성해주는 함수이다.
이터레이터는 클래스에 iter, next 또는 getitem 메소드를 구현해야 하지만, 제너레이터는 함수 안에서 yield만 사용하면 끝이다. 그래서 제너레이터는 이터레이터보다 훨씬 간단하게 작성할 수 있다.

제너레이터와 yield 알아보기

함수안에서 yield를 사용하면 함수는 제너레이터가 된다. yield에는 값(변수)을 지정한다.
yield로 함수를 제너레이터로 만들고 for 반복문에서 0, 1, 2 숫자 세 개 출력하기
yield.py

def number_generator():
    yield 0
    yield 1
    yield 2

for i in number_generator():
    print(i)

실행결과

0
1
2

for 반복문에 number_generator()를 지정해서 값을 출력해보면 yield에 지정했던 0, 1, 2가 나온다.(이터레이터와 사용 방법이 똑같다)

제너레이터그럼 객체가 이터레이터인지 확인하기

number_generator 함수로 만든 객체가 정말 이터레이터인지 dir 함수로 메서드 목록을 확인해서 확인할 수 있다.

>>> g = number_generator()
>>> g
<generator object number_generator at 0x03A190F0>
>>> dir(g)
[...., '__next__', '__iter__', ...]

number_generator 함수를 호출하면 제터레이터 객체(generator object)가 반환된다. 이 객체를 dir 함수로 살펴보면 이터레이터에서 볼 수 있는 iter, next 메소드가 들어잉ㅆ다.

실제로 제너레이터 객체의 next 를 호출해보면 숫자 0, 1, 2가 나오다가 StopIteration 예외가 발생한다.

>>> g.__next__()
0
>>> g.__next__()
1
>>> g.__next__()
2
>>> g.__next__()
StopIteration

이터레이터와 동작이 똒같다.
이처럼 함수에 yield만 사용해서 간단하게 이터레이터를 구현할 수 있다. 단, 이터레이터는 next 메소드 안에서 직접 return 값으로 값을 반환했지만 제너레이터는 yield에 지정한 값이 next 메소드(next 함수)의 반환값으로 나온다. 또한 이터레이터는 raise로 StopIteration예외를 직접 발생시켰지만 제너레이터는 함수의 끝까지 도달하면 StopIteration 예외가 자동으로 발생한다.
제너레이터는 제너레이터 객체에서 next 메소드를 호출할 때마다 함수 안의 yield까지 코드를 실행하며 yield에서 값을 발생시킨다(generator). 그래서 이름이 제너레이터(generator)이다.

Refer

[파이썬 코딩 도장]