이테레이터의 일종으로, next()메소드와 yield를 통해 처리와 처리중단을 반복하는 소진되는 이터레이터라 할 수 있습니다.
list,set,dict와 다르게 모든 값을 메모리에 들고 있지 않아도 된다는 이점이 있습니다.
제공받는 데이터가 무한하거나 모든 값을 계산하기엔 시간이 많이 걸릴때 그때 그때 처리하고 싶다면 사용한다고 합니다.
클래스내에서 iterator를 구현하려면 _iter_(iterator현재객체를 리턴) _next_(이터레이터의 루프를 도는 역할) (python2에서는 next 함수)등의 함수가 있어야하고 이를 통해서 이터레이터가 돌아갑니다. (파이썬의 duck typing)
generator 또한 for 루프 안에서 돌아갈 수 있는데 이를 통해서 generator expression이 가능합니다.
리스트 컴프리헨션과 유사한 형태인데 실제 값을 가지지 않고 표현식만 가지며 lazy operation을 진행하는 것이다.
앞서 말씀드린 것처럼 처리해야할 데이터가 많고 데이터양이 많아 리턴할 수 없거나 조금씩 처리해야할때, 미리 계산하면 속도가 너무느려 그때그때 수요가 있을때 처리해야할때 유용할 것 같습니다.
generator = (n*n for n in range(1001))
# generator는 generator 객체
print(type(generator)) # <class 'generator'>
# 리스트로 일괄 변환하려면
# lst = list(generator) #와 같이 처리해주면 됩니다.
# 10개 operation 수행
for i in range(10):
v = next(generator)
print(v)
#여기서 멈춰있기때문에 나머지 수행하면 나머지의 출력이 가능합니다.
# 나머지를 모두 출력합니다.
for x in generator:
print(x)
'Python' 카테고리의 다른 글
Python 개발하며 실수할 수 있는 것 몇가지 (0) | 2022.07.27 |
---|---|
파이썬으로 클린 아키텍쳐 적용하기 (0) | 2022.07.26 |
python 리스트를 딕셔너리로 한줄에 바꾸는 방법. (0) | 2021.12.28 |
python 메모리 관리( 레퍼런스 카운트, 가비지 콜렉터) (0) | 2021.06.20 |
python range()와 xrange() (메모리 효율성) (0) | 2021.06.20 |