본문 바로가기

파이썬

제너레이터

Generator(제너레이터, 발생자)


→ *iter()와 next() 메서드로 클래스를 작성하는걸 피하는 우아하고 간결한 문법, 값을 그 때 그 때 생성한다**

  • 제너레이터는 이터레이터를 생성해주는 함수(함수 안에서 yield를 사용)
  • yield에는 값(변수)을 지정
  • 제너레이터는 제너레이터 객체에서 next 메서드를 호출할 때마다 함수 안의 yield까지 코드를 실행함.
  • yield 문이 포함된 제네레이터 함수를 실행하면 제네레이터 객체가 반환되는데 이 때는 함수의 내용이 실행되지 않는다.
  • next()라는 빌트인 메서드를 통해 제네레이터를 실행시킬 수 있으며 next() 메서드 내부적으로 iterator 를 인자로 받아 이터레이터의 __next__() 메서드를 실행시킨다.

제너레이터를 사용하는 이유


메모리를 효울적을 사용하기 위해

  • List, Set, Dict 표현식은 iterable(이터러블)하기에 for 표현식 등에서 유용하게 쓰일 수 있다
  • 이터러블 객체는 유용한 한편 모든 데이터를 메모리에 적재하기 때문에 크기 만큼 차지하는 메모리 사이즈가 늘어남
  • 제네레이터는yield 와 next() 메소드를 통해 차례로 값에 접근할 때마다 메모리에 적재하는 방식
  • Lazy evaluation, 수행 시간이 긴 연산을 필요한 순간까지 늦출 수 있음

단점

  • 제네레이터는 그때그때 필요한 값을 던져주고 기억하지는 않기 때문에 a 리스트가 여러번 사용될 수 있는 반면 b 제네레이터는 한번 사용된 후 소진된다. 이는 모든 이터레이터가 마찬가지인데 List, Set 은 이터러블하지만 이터레이터는 아니기에 소진되지 않음

참고

  • 컨테이너 : 어떤 객체가 특정한 원소를 포함하고 있는지 아닌지를 판단할 수 있으면 컨테이너(리스트, set, dict 등)
  • Iterable의 특징은 일단 내부 원소에 하나씩 차례로 접근할 수 있다는 점.
  • 이터러블이iter 메소드를 가지고 있는 객체이기 때문.
  • iter 메소스가 하는 일은 iterator를 반환하는 것
  • Iterator는 next 메소드로 데이터를 순차적으로 호출할 수 있는 객체, “다음"값을 요청할 때마다 내부 상태를 유지하고 있기 때문에 다음값을 계산하는 방법을 알고있다.

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

파이썬 특징- 덕타이핑(Duck typing)  (0) 2021.07.16
파이썬, GIL  (0) 2021.07.13
가비지 컬렉션(garbage collection, gc)  (0) 2021.07.01
파이썬- Generator(제네레이터)란?  (0) 2021.03.28
파이썬 - isalnum(), isalpha()  (0) 2021.01.29