728x90
반응형
Generator
- 이터레이터를 생성해주는 함수
- yield의 개수만큼 이터레이터에서 값을 꺼낼 수 있다.
* generator를 통해 생성된 이터레이터는 하나씩 값을 꺼낼 수 있다. (yield 개수 만큼)
-> 부분적으로 여러번 yield를 통해 값을 바깥으로 전달 가능하기 때문에 특정 결과를 순차적으로 얻을 때, 통으로 결과를 기다릴 필요 없이 부분적으로 확인 가능 (예시 코드는 아래)
* 모든 값을 생성하는 것이 아니라 yield에 걸리는 값만 생성해서 메모리에 올리므로 메모리를 효율적으로 사용 가능
(이터레이터는 값을 미리 만들지 않고 값이 필요한 시점에 값을 만드는 방식)
예시
- return을 사용하는 일반 함수 예시
import time
def return_number():
num_list = []
for i in range(5):
time.sleep(1)
num_list.append(i)
return num_list
for i in return_number():
print(i)
위 함수는 0~4까지 num_list에 1초마다 넣어진 후에 print가 되므로
5초가 다 지나서 0,1,2,3,4 가 한번에 프린트된다.
- yield (제너레이터)를 사용하는 예시
import time
def return_number():
for i in range(5):
time.sleep(1)
yield i
for i in return_number():
print(i)
위의 예시는 1초 후에 0, 또 1초 후에 1 을 프린트한다.
결과적으로 0~4를 1초마다 하나씩 프린트한다.
물론 위와 같은 함수는 아래처럼 return을 통해서도 구현 가능하긴 하다
import time
def return_num2():
for i in range(5):
time.sleep(1)
print(i)
return_num2()
위와 같은 예시보다 제너레이터는 중간 중간 다른 함수가 실행될 수 있다는 것에 그 강점이 있다고 본다.
import time
def yield_count():
count = 0
while True:
yield count
count += 1
g = yield_count()
print(next(g))
print("다른 작업 1")
print(next(g))
print("다른 작업 2")
print(next(g))
# 0
# 다른 작업 1
# 1
# 다른 작업 2
# 2
728x90
반응형
'Python' 카테고리의 다른 글
Python: [False] and [True] # falsy values in python # [False] or [True] # bool (1) | 2023.12.02 |
---|---|
멀티프로세싱, 멀티스레딩 이해하기 with Python (0) | 2023.12.02 |
Python: Deep copy , Shallow copy, # mutable, immutable # 깊은 복사, 얕은 복사 (0) | 2023.11.26 |
Python: del vs slice 성능 비교 (0) | 2023.11.23 |
Python: Union[bool, None] = None # Type hint (0) | 2023.11.20 |