[Python] Generator(제너레이터)
- Python/기초
- 2021. 8. 9.
제너레이터는 iterator를 생성하는 함수인데 메모리 절약을 하거나
임시적으로 데이터 저장을 할 때 씁니다.
예를 들면, 게임을 할 때 잠시 일시정지를 하면 게임이 멈추는데 게임의 상황이 변하지 말아야 합니다.
그래서 게임이 다시 재개가 되면 기존에 했던 상태를 이어서 할 수 있게 됩니다.
이럴 때 필요한 것이 제너레이터 입니다.
제너레이터는 iterator를 생성하는 함수인데 yield를 쓰는 경우를 얘기합니다.
제너레이터로 설정을 하면 iterator가 순서대로 나오되 순서의 다음값은 필요에 따라 계산됩니다.
즉, 호출을 안 하면 멈춰서 대기하는 상태를 유지합니다.
보통 무한한 루프를 생성할 때 리스트나 딕셔너리는 메모리에 임시저장되어 불러오지만 제너레이터는 소비하는 형태로 되어 있어서 메모리 부담을 줄여줄 수 있습니다.
다만, 주어진 양을 넘어가면 오류가 발생하게 됩니다.
예를들어 100개를 출력하기로 했고 100개를 다 출력하면 101번째에서는 다음이 없기 때문에 에러가 발생합니다.
그래서 무한 루프를 사용하고 싶다면 while문과 함께 yield를 쓰면 됩니다.
제너레이터 생성
제너레이터로 함수를 만들고 싶다면 return 대신 yield로 하면 됩니다.
주어진 것을 뽑아내는 yield가 제너레이터의 핵심요소입니다.
그리고 next 메쏘드를 이용해 값을 출력하면 됩니다.
def gen():
yield 1
yield 2
yield 3
my_gen = gen()
print(next(my_gen))
print(next(my_gen))
print(next(my_gen))
print(next(my_gen))
주어진 값들을 다 출력하고 나면 에러가 뜹니다. 더이상 내보낼 게 없다는 뜻입니다.
제너레이터 표현
Generator comprehension 방법입니다.
소괄호 안에 comprehension 식을 넣으면 끝납니다.
gen = (x for x in range(3))
print(next(gen))
print(next(gen))
print(next(gen))
while 문에서의 활용
yield를 이용해서 계속해서 루프를 돌게 할 수 있습니다.
yield는 return과 마찬가지로 함수로 지정되지 않으면 안 되니 함수를 지정해 정합니다.
import random
def out_1():
while True:
number = random.randint(1,3)
if number == 1:
yield 'We have 1'
else:
yield number
next(out_1())
for문을 사용하면 range가 정해져 next가 range보다 많아지면 오류가 나올 수 밖에 없지만 while을 쓰면 무한으로 루프를 돌게 할 수 있습니다.
관련 포스팅
'Python > 기초' 카테고리의 다른 글
[Python] 리스트 모든 원소 하나의 문자열로 변환하기 (0) | 2022.02.17 |
---|---|
pip 직접설치하기 (0) | 2021.08.29 |
[Python] *args, **kwargs (0) | 2021.08.07 |
[Python] 패킹과 언패킹 (6) | 2021.08.02 |
[Python] 튜플 정렬하기 (2) | 2021.07.17 |