1. 하나의 문장으로 제너레이터를 구성하는 방법

 - 제너레이터 객체를 생성하는 방법을 언급하였음

  ① 제너레이터 함수(function) : 제너레이터를 만들기 위한 정의 

  ② 제너레이터 표현식(expression) : 제너레이터를 만들기 위한 식 

 

 1) 제너레이터 표현식 

   - 제너레이터 표현식은 제너레이터 함수와 마찬가지로 제너레이터 객체를 생성하는 방법임 

   - 제너레이터 표현식은 문법 구성이 리스트 컴프리헨션과 거의 똑같음 

- 리스트 컴프리헨션을 기반으로 만든 예제

 - def show_all(s) : iterable 객체를 전달하면서 이 함수 호출 

 - st : 구구단 2단을 전부 저장한 리스트 생성

 - show_all(st) : 위에서 정의한 show_all 함수 호출 

 

 

- 제너레이터 함수 기반으로 작성한 예제 

 - def time2() : 제너레이터 함수 정의

 - g = times2() : 제너레이터 객체의 생성

 - show_all : 위에서 정의한 show_all 함수 호출

 

 - 그러나 제너레이터 함수를 사용한 경우, 별도로 제너레이터 함수를 만들어주어야 함 

 - 제너레이터 함수의 장점과 단점은 명확 

장점 메모리를 효율적으로 사용할 수 있음
단점 함수를 별도로 정의해야 함 

 

 2) 제너레이터 표현식

  - 그러나 제너레이터 표현식을 사용하면, 위와 같은 단점을 해결할 수 있음

 

리스트 컴프리헨션 st = [ 2 * i for i in range(1, 10))]
제너레이터 표현식 g = ( 2 * i for i in range(1, 10))

 

- 제너레이터 객체이기 때문에 next 함수를 호출하면 값을 하나씩 출력함

 

 - 리스트 컴프리헨션 : 미리 만들어놓고 하나씩 던지는 것 

 - 제너레이터 표현식 : next 함수가 호출되어야 비로소 값을 만들어서 반환함 

                            : 제너레이터 표현식의 최대 장점인 'lazy evaluation'

 

 

2. 제너레이터 표현식을 직접 전달하기

  - 제너레이터 함수의 가장 큰 장점 : 표현의 간결함 

  - 그러나 제너레이터 함수를 복잡하게 만들면 그 장점을 잃어버려 쓸 필요가 없어짐

  - 결론적으로, 제너레이터 함수도 제너레이터 표현식도 모두 상황별로 더 어울리는 경우가 있으니 둘 다 만들 줄 알아야 함 

+ Recent posts