일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 다익스트라
- back propagation
- BFS
- tensorflow
- lazy propagation
- 문자열
- 가끔은_말로
- 미래는_현재와_과거로
- 백트래킹
- 알고리즘
- DP
- NEXT
- dropout
- 크루스칼
- 회고록
- 너비 우선 탐색
- dfs
- 플로이드 와샬
- 우선 순위 큐
- object detection
- Overfitting
- 분할 정복
- 이분 탐색
- 자바스크립트
- pytorch
- 2023
- c++
- 조합론
- 세그먼트 트리
- 가끔은 말로
- Today
- Total
Doby's Lab
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
'Code about AI > Python' 카테고리의 다른 글
상속을 할 때, super().__init__()을 하지 않는다면? (0) | 2023.11.11 |
---|---|
(os 모듈을 대체하는) pathlib 패키지 (0) | 2023.06.26 |
Python의 Iterator에 대하여 (0) | 2023.01.09 |
파이썬의 클래스(Class)에 대하여 (2) | 2022.12.08 |
백준 23572번: 승택이의 은밀한 비밀번호 (Python) (0) | 2022.07.24 |