본문 바로가기

Languages/파이썬

[파이썬] 제너레이터(generator)

본 포스팅의 내용은 "처음시작하는 파이썬" 의 내용을 많이 참조하여 작성되었음을 알려드립니다.


제너레이터(generator)란?

 제너레이터의 정의는 다음과 같다. "파이썬에서 시퀀스를 생성하는 객체이다." 무슨말인지 모르겠다면 우리가 반복문을 순회할 때 매번 사용했던 range함수를 떠올려 보면 된다. 이 함수가 바로 지금 배울 제너레이터를 반환하는 함수이다.

 

 제너레이터는 일반적인 함수와 달리, 리턴을 한 후에 자신이 마지막으로 리턴된 위치와 변수 값들을 기억하고 있다. 정확히는 return이라는 키워드를 사용하지 않고 yield라는 키워드를 사용한다. Range 함수를 우리가 직접 만들어보자.

 

def my_range(begin=1, end=100, step=1):
	number = begin
    while number <end:
    	yield number
        number += step
        
#제너레이터 타입 확인
type(my_range())

#사용예시
for i in my_range(100,1,-1):
	print(i, end=" ")
    
one_to_ten = my_range(1,10)
for i in one_to_ten:
	print(i)

 

신기한 점은 위의 예제에서 "one_to_ten"이라는 제너레이터를 사용해서 출력을 한 뒤에 재사용이 안된다는 점이다. 왜냐하면 제너레이터는 맨 처음에 생성되었던 일을 모두 마쳤다는 것을 "기억"하고 있기 때문이다. 제너레이터를 활용하면 함수를 객체처럼 필요할 때마다 루프 한번만 돌아서 사용하고 싶은 일이 있을 때 사용할 수 있다. 이것을 전문 용어로 "코루틴"이라고 하는데 프로그래밍 여러분야에서 사용되는 패턴이다. C#, Javascript에서도 yield로 제너레이터를 만들 수 있으며 이것을 이용하여 코루틴을 생성할 수 있다.

 

 예전에 Java로 컴파일러를 만드는 과제에서 코루틴의 필요성을 많이 느꼈었던 적이 있었다. 바로 코드를 정해진대로 잘라서 토큰형식으로 가져오는 Lexer가 이 처럼 동작하면 좋다고 생각했었다.(Next를 호출하면 다음 토큰을 가져오고, 또 그 다음 토큰을 가져오고) 그런데 그 당시에는 코루틴이라는 개념도 몰랐어서 필요성만 느꼈지 실제 구현은 엄두도 못냈던 것 같다. 이 밖에도 여러 프로그래밍 분야에서 코루틴이 사용되는데, 사용할 기회가 생기면 도전 해봐야겠다.