본문으로 건너뛰기
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강. 반복자와 제너레이터 기초 미완료 상태