반복 가능한 객체와 반복자는 역할이 다르다
리스트·문자열 같은 반복 가능한 객체에 iter()를 호출하면 반복자를 얻어. 반복자는 next()를 호출할 때마다 값을 하나 내주고, 끝에서는 StopIteration으로 완료를 알려.
for 문을 풀어 보면 규약이 보인다
for는 먼저 iter로 반복자를 만든 뒤 next를 되풀이하고 StopIteration에서 멈춰. 그래서 이 규약만 지키면 파일, 제너레이터, 직접 만든 객체도 같은 문법으로 걸을 수 있어.
반복자는 보통 한 번만 흐른다
리스트는 매번 새 반복자를 만들 수 있지만 반복자 자체는 이미 지나간 값을 되돌리지 않아. 한 번 소비한 파일이나 제너레이터를 다시 걷으면 빈 결과가 나오는 이유야. 여러 번 써야 한다면 원본 반복 가능한 객체에서 새 반복자를 만들거나 의도적으로 값을 저장해.
원칙: 값을 저장한 모음과 값을 흘려보내는 반복자를 구분하면 메모리와 수명 문제를 훨씬 쉽게 읽을 수 있어.