Python의 Generator에 대하여
https://draw-code-boy.tistory.com/511
본 포스팅은 Iterator에 대한 포스팅과 이어집니다.
Generator
Generator란 Iterator를 생성하기 위한 함수입니다.
+ 통상적으로 Generator로부터 생성된 Iterator를 Generator Iterator라고 합니다.
기본적인 개념만 듣고는 조금 어렵게 다가올 수 있지만 Iterator를 생성하는 iter()를 생각했을 때는 보다 쉽게 다가옵니다.
명령어 yield
Generator를 만들기 위해서는 특별한 것 없이 보편적인 함수를 선언하듯이 선언하되 return이라는 명령어가 yield로 바뀌었을 뿐이라는 것을 알고 있으면 됩니다.
li = [1, 2, 3, 4]
def gene_li():
for data in li:
yield data
li_iter = gene_li()
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
작동 방식
- 함수와 달리 Generator Iterator 선언과 동시에 실행되지 않습니다.
- next()를 통해 실행이 되고, Generator는 yield가 있는 곳까지 실행됩니다.
- 그 후, Generator는 일시 중단되며 다시 next()로 실행했을 때, 중단되었던 곳에서 다시 시작합니다.
아래와 같은 코드를 실행했을 때를 예시로 작동 방식에 대해 알아봅시다.
li = [1, 2, 3, 4]
def gene_li():
print('Generator Work')
for data in li:
yield data
yield data * 2
yield data * 4
li_iter = gene_li()
print('Declare Iterator')
while True:
try:
print(next(li_iter))
except:
break
# Output
Declare Iterator
Generator Work
1
2
4
2
4
8
3
6
12
4
8
16
Generator Iterator를 선언했을 때, 즉시 실행되지 않고, next()를 통해 실행되는 것이기 때문에
'Declare Generator'가 출력되고, 그다음 while을 통해 next()가 실행되어 'Generator Work'가 실행되는 것을 알 수 있습니다.
또한, next()가 실행된 후, yield가 실행되었던 부분에서 다시 시작된다고 했는데
첫 번째 yield 값이 1이고, 다음 yield 값이 data * 2 임을 확인하였을 때, 두 번째 yield 값이 2인 것을 보아 말했던 작동 방식대로 돌아가는 것을 확인할 수 있습니다.
이점
Iterator와 마찬가지로 메모리 효율의 관점에서 데이터를 바로 폐기한다는 것이 큰 이점입니다.
또한, Iterator와 달리 함수 내에서 다양한 로직을 구현하여 쓸 수 있다는 것에서 Iterator보다 나은 이점을 가지고 있습니다.
Reference