파파비의 블로그

[파이썬, Python] 제너레이터, Generator 본문

개발/python

[파이썬, Python] 제너레이터, Generator

N. Dave 2021. 5. 17. 17:48
반응형

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

 

반응형
Comments