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