- 파이썬에서 보통의 함수는 값을 반환하고 종료 하지만 제너레이터 함수는 값을 반환하기는 하지만, 산출(yield)한다는 차이점이 있다.
- 쉬운 표현으로, 이터레이터를 생성해주는 함수라고 볼 수 있다.
예제)
결과)
실행을 시켜보면
결과)
제너레이터 함수는 실행중에 send 함수를 통해 값을 전달할 수 있다.
코드)
결과)
generator_send() 함수를 gen=next(generator_send()) 으로 next의 반환값으로 나오게 한다.
gen.send(2) 를 하게 되면, 2를 함수에 인수로 보내고, 함수는 2를 가지고 while 문을 돌린다.
generator_send()는 현재 return이 아닌 yield이기 때문에, 코드 실행을 함수 바깥에 양보한다.
lazy evaluation의 효과를 너무 잘 비유해준 글이 있어 간단히 정리 해보려고 한다.
"만약 내가 라면집을 운영한다고 가정했을 때, 예약 손님 10명을 받았다.
그중 한분이 오셔셔, 한번에 다 오지는 못했고 일정 마치시는대로 오신다고 한다.
이때, 한분이 오셨다고 해서 라면 10개를 다 끓여놓지 않을것이다. 대신 예약 손님이 오실 때 맞추어 라면을 끓일 준비를 해 둘 것이다.
10분이 한번에 오셨다면 10개의 라면을 한번에 끓이는 것이 효율적이지만, 10분이 끊어서 오신다면 오시는 때에 맞추어 끓여 드릴수 있도록 준비를 해놓는것이 더 효율적일 것이다."
Lazy Evaluation은 예약손님이 오시는 때에 맞추어 라면을 끓일 수 있도록 준비하는 것이다.
즉, 어떤 값이 실제로 쓰일 때 까지 그 값의 계산을 뒤로 미루는 동작 방식이다.
장점
-. 필요할 때만 평가되기 때문에 메모리를 효율적으로 사용할 수 있다.
단점
-. 코드가 점점 복잡해지기 때문에 유지보수성이 떨어질 수 있다.
- list comprehension
[lazy_return(i) for i in L] -. 대괄호로 묶어준다.
- lazy evaluation
(lazy_return(i) for i in L)
-. list comprehension과 똑같이 작성하되, "소괄호"로 묶어 준다.
list comprehension 과 lazy evaluation 실행
- comprehension list 결과
- generator 결과
차이 설명)
comprehension list 실행을 하게되면 sleep 메서드가 먼저 다 실행이 된 후(3초 일시정지 후) 한번에 1,2,3,을 출력해준다.
generator 실행을 했을 때는 1초을 정지후 1 출력, 다음 1초 정지후 2 출력, 1초 정지후 3 출력이 되었다.
comprehension list는 반복 조건에 맞게 함수의 실행구문을 모두 반복 후 1회 return 하였고, generator의 경우 (실행구문 -> return)의 순으로 3회 return 했다.
위의 예시를 가져와서 비교를 해본다면, comprehension list는 "sleep 1s" 손님이 일단 모두 오기를 기다린 후, 한번에 1,2,3의 라면을 내어준 것이고,
generator는 "sleep 1s" 손님이 올 때를 맞추어 각 1,2,3의 라면을 내어준 것이다.