본문 바로가기
Python

제너레이터, yield (이터레이터와 제너레이터)

by dharana7723 2021. 6. 19.

이테레이터의 일종으로, 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)