Generator는 iterator의 역할을 할 수 있는 generator 객체를 만들기 위한 함수입니다. 쉽게 말하면 iterator를 생성해 주는 함수입니다.(매직 메소드인 __next__()가 정의되어 있으므로) 다만 return 문을 통해 특정 값을 반환하고 호출 스택에서 제거되어 종료되는 일반적인 함수와 다르게, generator는 yield를 만나면 함수가 정지되며, next()가 호출될 때마다 하나의 값만을 반환하게 됩니다. 따라서 일반적인 iterator에 비해 아주 작은 메모리만을 사용합니다. 이를 프로그래밍 분야에서는 '게으른 연산'이라고 부릅니다.

Generator 함수

List의 모든 값을 제곱하여 반환하는 함수를 작성해 보겠습니다.

위의 square_numbers는 우리가 지금까지 봐왔던 일반적인 함수입니다. 한 번의 호출에 한 번의 반환을 하고, 그대로 함수는 종료됩니다.

아래의 square_numbers_generatorreturn 대신 yield라는 키워드를 통해 값을 반환하는 함수입니다. yield 구문은 해당 함수의 반환값에 대해 next()가 호출될 때마다 한 번씩 실행되며, 따라서 iterator와 거의 동일하게 동작합니다. 빌트인 함수 dir()을 이용해 객체에 담겨 있는 필드와 메소드를 확인해 보면, __next__() 메소드가 정의되어 있는 것도 확인할 수 있습니다.

Generator expression

위에서 함수 형태로 선언했던 generator 표현을 조금 더 쉽게 할 수 있도록, Python에서는 generator expression을 제공합니다. List comprehension의 대괄호를 소괄호로 바꾸기만 하면 됩니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] memoize  (0) 2018.07.26
[Python] Assert  (0) 2018.07.25
[Python] Iterable, Sequence, Iterator  (0) 2018.07.22
[Python] Decorator  (0) 2018.07.21
[Python] Closure  (0) 2018.07.20

+ Recent posts