ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • yield
    언어/파이썬 2021. 1. 20. 00:11

    yield 키워드를 알기위해서는 Generator 를 이해해야 한다.

     

    Generator는 Iterator를 생성해주는 함수이다. 

    Iterator는 클래스에 __iter__, __next__ 메소드를 구현해야 하지만 제너레이터는 함수안에서 yield라는 키워드만 사용하면 끝이다. 

     

    함수 안에서 yield를 사용하면 함수는 제너레이터가 되며 yield에는 값(변수)을 지정한다.

    그렇다면 Generator는 왜 사용할까? 만약 숫자 1억개를 만들어내 계산하는 프로그램을 작성한다고 하자., 이경우 제너레이터가 없다면 메모리 어딘가에 만들어낸 숫자 1억 개를 보관하고 있어야 한다. 그러나 제너레이터를 이용하면 단순히 제너레이터만 생성해두고 필요할때 언제든 숫자를 만들어 낼 수 있다. 만약 1억개중 100개 정도만 쓰인다고 하면 차이는 매우클것이다. 

    또한 number_generator의 반환값을 g변수에 넣어 g가 어떤 object인지 확인해보면 __iter__와 __next__가 구현된것으로 보아 iterator라는 것을 알 수 있다.

     

    generator class의 object인 g에 __next__ 메소드를 호출한 결과 0, 1, 2가 나오다가 StopIteration 예외가 발생한다. 

    즉, 이렇게 보면 Iterator와 동작이 같다.

    단, Iterator는 return 으로 __next__함수의 결과를 반환하고 StopIteration을 직접 raise를 통해 발생시켜야 했다. 하지만 generator는 yield를 사용하고 자동으로 StopIteration이 발생된다.

     

    generator는 generator 객체에서 __next__ 메서드를 호출할 때마다 함수 안의 yield까지 코드를 실행하며 yield에서 값을 발생시킨다.

    근데 왜 키워드의 이름을 yield라고 지었을까? yield는 생산하다라는 뜻과 함께 양보하다라는 의미를 갖고 있다. 

    즉, yield를 사용하면 값을 함수 바깥으로 전달하면서 코드 실행을 함수 바깥에 양보를 한다.

    따라서 yield는 현재 함수를 잠시 중단하고 함수 바깥의 코드가 실행되도록 만든다.

     

    그림으로 예시를 들어보자면 

     

    위의 형태로 예시를 들 수 있겠다. 처음에 g를 선언하고 next를 호출하면 number_generator로 가서 yield 까지 실행시키고 이 값을 함수 바깥으로 전달하고 자신의 시행을 양보한다. 그다음 또 b=next(g)를 실행하여 다시 number_generator로 가 yield 0이후의 코드인 yield 1을 실행시킨다. 이러게 진행해 가면서 함수가 진행된다. 

     

     

     

     

    '언어 > 파이썬' 카테고리의 다른 글

    파이썬은 왜 느릴까?  (0) 2021.01.21
    우선순위 큐  (0) 2021.01.21
    원형 큐(Circular Queue)  (0) 2021.01.18
    파라미터로 *(star)와 **(double star) 는 어떤 의미 일까?  (0) 2021.01.18
    Queue  (0) 2021.01.16

    댓글