제너레이터(generator)는 이터레이터의 한 종류로, 값을 한 번에 모두 생성하는 대신, 필요한 순간에 값을 하나씩 생성해 메모리 효율적으로 데이터를 처리할 수 있습니다. 이터러블 객체와 유사하게 순회 가능한 특성을 갖고 있지만, 한 번 생성된 값을 재사용하지 않는다는 특징이 있습니다.
lazy evaluation(지연 평가):
yield 키워드 사용:
yield 키워드를 사용해 값을 반환합니다. yield를 만나면 함수의 상태가 일시 정지되고, 다시 호출하면 정지된 상태에서 이어서 실행됩니다. 따라서 제너레이터는 함수를 중단했다가 다시 실행하는 특징을 가집니다.한 번만 사용 가능:
def simple_generator():
yield 1
yield 2
yield 3
gen = simple_generator()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
위 코드에서 simple_generator() 함수는 yield 키워드를 사용해 값을 하나씩 반환합니다. next()를 통해 호출할 때마다 다음 yield문까지 실행되고 멈춥니다.
메모리 효율성:
복잡한 데이터 처리를 단순화:
무한 시퀀스 생성 가능:
제너레이터는 리스트 컴프리헨션과 유사한 구문인 제너레이터 표현식을 통해 간결하게 작성할 수 있습니다. 리스트 컴프리헨션처럼 보이지만, 소괄호를 사용해 메모리에 모든 데이터를 생성하지 않고 하나씩 처리합니다.
gen_exp = (x * x for x in range(10))
print(next(gen_exp)) # 0
print(next(gen_exp)) # 1
print(next(gen_exp)) # 4
| 항목 | 이터레이터 | 제너레이터 |
|---|---|---|
| 생성 방식 | __iter__ 및 __next__ 메서드 구현 | 함수 내 yield 키워드 사용 |
| 메모리 사용 | 전체 값 메모리에 저장 | 필요한 시점에 값 생성 |
| 순회 가능 횟수 | 여러 번 가능 | 한 번만 가능 |
제너레이터는 데이터 처리가 많거나, 메모리 효율성을 극대화해야 하는 상황에서 특히 유용한 기능입니다.