본문으로 건너뛰기
Python 기초집LESSON 20

반복자와 제너레이터 기초

난이도입문
예상 시간30분
선수지식이전 강의

20강. 반복자와 제너레이터 기초

1. 이번 강의에서 해결할 문제

수백만 건의 로그를 리스트로 한 번에 읽으면 메모리 사용량이 커집니다. 필요한 시점에 한 기록씩 읽고 집계합니다.

2. 학습 목표

3. 핵심 개념

iterable은 반복자를 만들 수 있는 객체이고 iterator는 next()로 값을 하나씩 제공합니다. 제너레이터 함수는 yield에서 상태를 멈췄다가 다음 요청에 이어 실행합니다. 전체 목록을 만들지 않아 큰 입력에 유리합니다.

4. 단계별 코드 예시

파일 경로: C:\dev\game-log-analyzer\battle_analyzer\stream.py

battle_analyzer/stream.py
import json
from pathlib import Path
from typing import Iterator

from .models import BattleRecord
from .readers import record_from_dict


def iter_json_lines(path: Path) -> Iterator[BattleRecord]:
with path.open(encoding="utf-8") as file:
for line_number, line in enumerate(file, start=1):
if not line.strip():
continue
try:
yield record_from_dict(json.loads(line))
except (KeyError, TypeError, ValueError) as error:
raise ValueError(f"{line_number}번째 로그가 잘못됐습니다.") from error

파일 경로: C:\dev\game-log-analyzer\main.py

main.py
from pathlib import Path
from battle_analyzer.stream import iter_json_lines

records = iter_json_lines(Path("data/battles.jsonl"))
total = sum(record.damage for record in records)
print("총 피해:", total)
PowerShell · 실행
.\.venv\Scripts\python.exe .\main.py

5. 코드가 동작하는 이유

함수 호출 직후 파일을 모두 읽지 않고 반복이 시작될 때 실행합니다. 각 yield는 BattleRecord 하나를 전달합니다. sum이 다음 값을 요청할 때 파일의 다음 줄을 읽으므로 메모리에는 현재 기록 중심의 작은 상태만 유지됩니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

반복자와 제너레이터 기초 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“반복자와 제너레이터 기초”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2“반복자와 제너레이터 기초”의 작업 기준으로 ‘제너레이터 내부 오류 시 줄 위치 없음’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

20강. 반복자와 제너레이터 기초 미완료 상태