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 |