파이썬 ) generator

김건우·2020년 7월 24일
0

파이썬 문법

목록 보기
5/5
post-custom-banner

1. 정의

  • 파이썬에서 보통의 함수는 값을 반환하고 종료 하지만 제너레이터 함수는 값을 반환하기는 하지만, 산출(yield)한다는 차이점이 있다.
  • 쉬운 표현으로, 이터레이터를 생성해주는 함수라고 볼 수 있다.

2. generator 분석하기

1. 제너레이터 객체 확인하기

예제)

결과)

  • generator_squares() 를 print하면 속성값이 나온다.
  • 결과를 보면 'generator object'임을 확인 할 수 있다.

2. yield 키워드

  • yield는 제너레이터 함수에서 값을 반환할 때 사용되며 yield 호출후에 다시 next가 호출 될때 까지 현재의 상태에서 머물고 있다가, next 함수가 호출되면 이전의 상태에 이어서 연산을 수행한다.

  • iterator와 다르게 __iter__ 와 __next__ 함수 두개가 같이 존재하는 것을 볼 수 있다.

    실행을 시켜보면

    결과)

  • range(3)만큼 next되기 때문에 [0,1,2]가 순차적으로 i에 저장된다.
  • 2의2승이 출력된 후, 다음 3이 없기 때문에 "StopIteration" 에러가 나게 된다.

3. send함수로 값 전달하기

  • 제너레이터 함수는 실행중에 send 함수를 통해 값을 전달할 수 있다.

    코드)

    결과)

  • generator_send() 함수를 gen=next(generator_send()) 으로 next의 반환값으로 나오게 한다.

  • gen.send(2) 를 하게 되면, 2를 함수에 인수로 보내고, 함수는 2를 가지고 while 문을 돌린다.

  • generator_send()는 현재 return이 아닌 yield이기 때문에, 코드 실행을 함수 바깥에 양보한다.

4. lazy evaluation의 장,단점 및 리스트 컴프리헨션과의 차이점

1. lazy evaluation의 사용 용도

  • lazy evaluation의 효과를 너무 잘 비유해준 글이 있어 간단히 정리 해보려고 한다.

    "만약 내가 라면집을 운영한다고 가정했을 때, 예약 손님 10명을 받았다.
    그중 한분이 오셔셔, 한번에 다 오지는 못했고 일정 마치시는대로 오신다고 한다.
    이때, 한분이 오셨다고 해서 라면 10개를 다 끓여놓지 않을것이다. 대신 예약 손님이 오실 때 맞추어 라면을 끓일 준비를 해 둘 것이다.
    10분이 한번에 오셨다면 10개의 라면을 한번에 끓이는 것이 효율적이지만, 10분이 끊어서 오신다면 오시는 때에 맞추어 끓여 드릴수 있도록 준비를 해놓는것이 더 효율적일 것이다."

  • Lazy Evaluation은 예약손님이 오시는 때에 맞추어 라면을 끓일 수 있도록 준비하는 것이다.

    즉, 어떤 값이 실제로 쓰일 때 까지 그 값의 계산을 뒤로 미루는 동작 방식이다.

2. lazy evaluation의 장점 과 단점

  • 장점
    -. 필요할 때만 평가되기 때문에 메모리를 효율적으로 사용할 수 있다.

  • 단점
    -. 코드가 점점 복잡해지기 때문에 유지보수성이 떨어질 수 있다.

3. lazy evaluation 표현

  • list comprehension
[lazy_return(i) for i in L]
-. 대괄호로 묶어준다.
  • lazy evaluation
(lazy_return(i) for i in L)

-. list comprehension과 똑같이 작성하되, "소괄호"로 묶어 준다.

4. 컴프리헨션과의 차이점

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의 라면을 내어준 것이다.

profile
꾸준하게 공부하기
post-custom-banner

0개의 댓글