나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Language/python

Generators (제너레이터)

devidea 2017. 4. 12. 11:33

제너레이터는 하나의 값을 결과로 리턴하는 것이 아니라 연속된 결과를 리턴하는 함수이다.

아래 코드는 제너레이터의 간단한 예제 코드이다.

# countdown.py
#
# A simple generator function

def countdown(n):
    print("Counting down from", n)
    while n > 0:
        yield n
        n -= 1
    print("Done counting down")

# Example use
if __name__ == '__main__':
    x = countdown(10)
    print(x)
    for i in x:
        print(i)

결과는 다음과 같이 나온다.

<generator object countdown at 0x10a716c50>

Counting down from 10

10

9

8

...

1

Done counting down


제너레이터 함수를 보면은 return 구문이 존재하지 않는다.

그런데 결과를 보면 for 문을 통해 연속된 숫자가 나타남을 알 수 있다. (일반적으로 for 구문을 통해 연속된 값을 확인 할 수 있다)


지금부터는 제너레이터의 다른 특징들을 살펴보도록 하자.


제너레이터는 일반적인 함수와 다른 특징을 가진다.

코드 14번라인에서 제너레이터를 print 문으로 출력을 해 보았더니 결과값이 나오지 않고 generator object가 표시된다.


제너레이터 함수를 호출할때 시작되는 것이 아니라 generator object만을 생성하는 것이다.

제너레이터 함수는 next()를 호출할 때 수행이 되는 것이며, yield 구문을 통해 값을 출력하도록 한다.


그러면 다음 예에서는 next()를 호출하지도 않았는데 결과가 나타난 것일까?

for 루프를 통해서 next()가 호출되었기 때문이다.


그러면은 제너레이터를 왜 쓰는걸까?

메모리 사용을 줄일 수 있기 때문이다.


일반적인 함수에서 결과값을 list 형태로 리턴했을 경우에 해당 list의 값을 메모리에 올려야 한다.

하지만 제너레이터는 결과값을 메모리에 올리는 형태가 아닌 next를 호출할 때마다 데이터를 가져오는 방식이기 때문에 메모리 사용량이 현저히 준다.

반응형

'Language > python' 카테고리의 다른 글

[python] list  (0) 2018.03.28
[python] 상속 기본 및 factory method 패턴 정리  (0) 2018.03.27