파파비의 블로그
[파이썬, Python] 제너레이터, Generator 본문
반응형
C#, 유니티의 코루틴 같은 것이다.
호출할 때 마다 리턴되는 값이 달라지게 할 수 있는 기능이다.
제너레이터가 유용한 이유는, 예를 들어 숫자 1억개를 만들어내려면
그만큼 메모리 공간이 필요하지만,
제너레이터를 활용하면 생산해내는 조건만 메모리에 두고, 호출할 때마다 조건에 의해 새로운 값들이 나오게 할 수 있다.
제너레이터를 활용하는 방법은
기본 함수든 어디든, return 대신, yield를 사용하면 된다.
그러면 제너레이터가 return된다.
해당 제너레이터를 next() 함수에 인자로 넣으면 값이 나온다.
예시를 살펴보자
def get_natrual_number():
n = 0;
while True:
n += 1;
yield n;
g = get_natrual_number(); # g는 제너레이터
for _ in range(100):
print(next(g));
# 결과는 1 2 3. .. 100
정확히는 yield 값을 리턴하고 함수는 멈춘다. 다음 번 호출 때 그 다음 yield가 나오기까지 실행되는 것이다.
예시를 통해보자
def generator():
yield 1;
yield "string";
yield True
g = generator(); # 역시나 g는 제너레이터임
print(next(g)); # 1
print(next(g)); # string
print(next(g)); # True
제너레이터 원리를 활용하는 대표적인 함수가 바로 range() 다.
a = [n for n in range(1000000)]
b = range(10000000)
len(a) == len(b) # True
sys.getsizeof(a) # 100만개의숫자를 메모리에 만들어놔서 큰 자리 차지
sys.getsizeof(b) # 조건만 만들어놨기 때문에 매우 적은 메모리 차지
# 호출 될때 조건이 실행되므로 바로 실행됨
b[999]
> 999
반응형
'개발 > python' 카테고리의 다른 글
[python/파이썬] 여러 페이지를 한번에 크롤링하기 (0) | 2021.06.13 |
---|---|
[python/파이썬] 크롤링 기초 (BeautifulSoup & Requests 라이브러리) (0) | 2021.06.13 |
[python/파이썬] 함수 코딩시 Tips (0) | 2021.06.11 |
[파이썬, Python] 임의 정밀도, int (0) | 2021.05.17 |
[파이썬, Python] enumerate 함수 (0) | 2021.05.17 |
Comments