제너레이터는 iterator를 생성해주는 함수로, 함수의 생김은 다른 함수들과 다르지 않으나 yield 구문을 쓴다는 것이 차이점이다.
#1 sd라는 Generator 생성
def sd(n) :
i = 0
while i < n:
yield i
i += 1
#2 sd함수
for x in sdsd(5):
print(x)
> 0
> 1
> 2
> 3
> 4
#3 bb라는 일반함수 생성
def bb(n) :
i = 0
while i < n:
print(i)
i += 1
#4 bb함수 사용
bb(5)
> 0
> 1
> 2
> 3
> 4
제너레이터를 비교하면서 이해하기위해 일반함수를 만들었다.
#1
제너레이터 함수에는 yield구문이 있어야 한다. yield와 return 구문은 값을 반환하고 종료된다는 공통점이 있지만, yield는 함수에서 일종의 이정표 역할을 한다는 차이점이 있다. 제너레이터 함수가 소환되면 yield 다음 구문부터 시작하기 때문이다.
#2
#2의 for문은 next(sdsd(5)) 구문을 다섯번 실행한다는 뜻과 같은데, 구문을 실행할 때 마다 yield 다음부터 실행된다. 즉, 제너레이터는 출력을 중심으로 진행되는 함수다. yield로 값을 반환하면 함수가 잠깐 멈췄다가 또 제너레이터를 소환하면 그 다음부터 멈췄던 함수가 다시 진행되는 식이다.
#4
bb같은 일반 함수는 #2처럼 for문으로 출력할 수 없는데, iterable하지 않기 때문이다.
제너레이터를 사용하는 이유
메모리 절약 : 제너레이터는 일반 함수처럼 모든 데이터를 메모리에 저장해 두는 식이 아니고, 소환될 때마다 연산을 하는 식이라 데이터가 클 경우 메모리에 부담이 덜 간다. 그래서 모든 값을 다 사용하면 소진된다(iterator의 특성)
제너레이터를 사용하려면
1. yield를 이용한 제너레이터 함수
2. 제너레이터 표현식