제너레이터(generator)는 「값을 한꺼번에 만들지 않고 하나씩 필요할 때마다 만들어 주는」 특수한 함수입니다.
메모리를 적게 쓰고, 무한 시퀀스도 표현할 수 있는 강력한 패턴입니다.
기본 사용.
def count_up(n): for i in range(n): yield i.
for x in count_up(5): print(x) — 0, 1, 2, 3, 4.
yield는 return과 비슷해 보이지만 「값을 반환하면서 함수의 실행 위치를 기억」해, 다음 호출에서 그 자리부터 이어서 실행합니다.
제너레이터의 가장 큰 매력은 「게으른 평가(lazy evaluation)」입니다.
100만 개의 값을 만드는 함수가 있어도, 제너레이터로 만들면 메모리에 100만 개를 미리 만들지 않고 「필요할 때 한 개씩」 만듭니다.
메모리 사용이 일정합니다.
활용 예시: 큰 파일 한 줄씩 처리.
def read_lines(filename): with open(filename) as f: for line in f: yield line.strip().
100GB 파일도 메모리에 다 올리지 않고 처리할 수 있습니다.
제너레이터 표현식.
리스트 컴프리헨션의 [ ] 대신 ( )를 쓰면 제너레이터가 됩니다.
squared_gen = (x**2 for x in range(1000000)) — 100만 개를 메모리에 만들지 않음.
sum(x**2 for x in range(1000000)) — 100만 개의 제곱 합을 메모리 효율적으로 계산.
큰 데이터 처리의 표준 패턴입니다.
한 줄 요약
제너레이터는 yield로 값을 하나씩 만들어 주는 함수로, 메모리를 절약하고 무한 시퀀스도 표현할 수 있습니다.
큰 파일·데이터 처리에 표준 패턴입니다.
더 알아볼 것
- yield from — 제너레이터 위임
- 제너레이터의 send·throw·close
- async generator — 비동기 제너레이터