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반복자와 제너레이터 기초 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
20강. 반복자와 제너레이터 기초 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.