본문 바로가기

파이썬

파이썬- Generator(제네레이터)란?

파이썬 제너레이터에 대해 알아보았습니다. 아직 완전히 이해되지는 않았지만 일단 정리해두고 추가로 내용을 덧붙여나가겠습니다.

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


  • iterator를 생성해주는 함수, 함수 안에서 yield를 사용, yield에는 값(변수)을 지정
  • 모든 generator는 iterator

    제너레이터 장점

  • 이터레이터는 클래스에 iter, next 또는 getitem 메서드를 구현해야 하지만 제너레이터는 yield 키워드만 사용
  • 제네레이터를 사용하면 yield 를 통해 그때그때 필요한 값만을 받아 쓰기때문에 모든 값을 메모리에 들고 있을 필요가 없게된다.

제너레이터와 yeild


  • 제네레이터 함수를 호출하면 제네레이터 객체(generator object)가 반환, 이 때는 함수의 내용이 실행되지 않음
  • next()라는 빌트인 메서드를 통해 제네레이터를 실행시킬 수 있으며 next() 메서드 내부적으로 iterator 를 인자로 받아 이터레이터의 __next__() 메서드를 실행시킨다.
    • dir 함수로 메서드 목록을 확인할 수 있음
    • 이터레이터는 return 으로 값을 반환하지만 제너레이터는 yield에 지정한 값이 next 함수의 반환값으로 나옴
  • 이터레이터는 raise StopIteration 예외 발생, 제너레이터는 자동으로 함수 끝에 도달하면 예외 발생
  • 제너레이터 객체에서 next 메서드를 호출할 때마다 함수 안의 yield까지 코드를 실행

for 반복문과 제너레이터

  • For 반복문은 반복시마다 제너레이터의 __next__ 를 호출, 예외 발생 시 끝
  • List, Set, Dict 표현식은 iterable(이터러블)하기에 for 표현식 등에서 유용하게 쓰일 수 있다.
  • 이터러블 객체는 유용한 한편 모든 값을 메모리에 담고 있어야 하기 때문에 큰 값을 다룰 때는 별로 좋지 않다.
  • 제네레이터를 사용하면 yield 를 통해 그때그때 필요한 값만을 받아 쓰기때문에 모든 값을 메모리에 들고 있을 필요가 없게된다.

참고 개념

  • 컨테이너 : 어떤 객체가 특정한 원소를 포함하고 있는지 아닌지를 판단할 수 있으면 컨테이너(리스트, set, dict 등)
  • Iterable의 특징은 일단 내부 원소에 하나씩 차례로 접근할 수 있다는 점(값 생성기). 이터러블이 __iter__ 메소드를 가지고 있는 객체이기 때문. 이 iter 메소스가 하는 일은 iterator를 반환하는 것
    제너레이터와 이터레이터
  • Iterator는 next 메소드로 데이터를 순차적으로 호출할 수 있는 객체, 다음 next() 호출을 위해 상태를 변경, 현재 호출에 대한 결과값 저장, next()를 가진 모든 객체

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

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