수학과의 좌충우돌 프로그래밍

[python]제너레이터(generator)를 알아보자 본문

프로그래밍 언어/Python

[python]제너레이터(generator)를 알아보자

ssung.k 2019. 3. 31. 21:44

파이썬 제너레이터

일반적인 함수부터 생각을 해보자. 함수는 한 번 호출되면 return을 만날 때까지 혹은 return이 없다면 마지막 구문을 만날 때까지 실행된다. 그리고 호출이 끝나는 순간 내부 함수나 로컬 변수들은 메모리를 반환하게 된다. 이는 함수가 다시 호출되어도 마찬가지로 같은 일을 반복한다.

이런 함수의 한계점에 봉착하여, 함수가 본인이 한 일을 기억하고 있다가 재 호출 시 이어서 할 수 있도록 새로운 함수를 만들었는데 이를 제너레이터라고 한다. 제너레이터가 무엇인지 예제를 통해서 알아보자.

def normal_function(list):
    result = []
    for i in list:
        result.append(i * i)
    return result

input = [1,2,3,4,5]
result = normal_function(input)

print(result)
# [1, 4, 9, 16, 25]

일반적으로 입력받은 list의 값들을 제곱해서 return 하는 함수이다. 이를 제너레이터로 구현한다면 어떻게 할 수 있을까?

def generator(list):
    for i in list:
        yield i * i

input = [1,2,3,4,5]
result = generator(input)

print(result)
# <generator object generator at 0x1027ca408>

return 대신 yield를 사용하고 결과를 확인해보니 우리가 원하는 값이 아닌 generator 객체를 반환한다. 정확한 값을 확인하기 위해서는 next를 사용해서 확인을 한다.

print(next(result)) #1
print(next(result)) #4
print(next(result)) #9
print(next(result)) #16
print(next(result)) #25
print(next(result)) #StopIteration

값을 호출할 때마다 함수를 처음부터 시작하지 않고 기존의 상태를 기억했다가 다음 값을 return 한다. 그리고 5번이 반복했을 때는 StopIteration이라는 오류가 나게 된다. 따라서 보통 next 대신 for 반복문을 통해서 값을 순회한다.

def generator(list):
    for i in list:
        yield i * i

input = [1,2,3,4,5]
result = generator(input)

for num in result:
    print(num)
"""
1
4
9
16
25
"""

처음 generator의 존재를 발견한 건 실수를 통해서였다. list comprehension을 사용하던 중 []를 ()로 사용하는 실수를 했고 그 결과 generator가 되었다.

Comments