학원에서 학생들에게 파이썬 for문에 대해 설명하면서 공부한 내용입니다. 단순히 for문은 반복된 코드가 있을 때 사용하는 거야~ 라고 끝내면 되기도 한데 또 성격상 자세하게 알려주고 싶어서 이것 저것 찾아보니 여기까지 와버렸습니다..
기본적인 For문의 구조는 다음과 같습니다.
그런데 여기서 의문(?) 생각해보면 in 뒤에는 다양한 객체가 올 수 있습니다. 밑에 코드를 보면 리스트 , 문자열 , range(10) 함수 등 다양하게 사용할 수 있다는 걸 알 수 있습니다.
for i in [1,2,3]:
print(i)
for i in "hello World":
print(i)
for i in range(10):
print(i)
그러면 어떻게 for문은 이 다양한 객체들을 반복(?) 시킬 수 있는 걸까?
파이썬에는 Iterable한 객체들이 존재합니다. Iterable한 객체란 Iterator를 얻을 수 있는 객체를 Iterable한 객체라고 합니다. 즉, __iter__ 매직 메소드가 존재하는 객체는 Iterable한 객체라고 할 수 있습니다.
확인해 보면 range 내장 함수의 반환값 또한 __iter__ 매직 메소드를 갖고 있기 때문에 iterable한 객체라고 할 수 있습니다.
Iterator 객체는 iter함수(__iter__)를 통해 반환되어진 객체이며, 값을 차례대로 꺼내는 기능을 제공하는 객체이다.
그렇다면 for문의 구체적인 동작과정은 다음과 같다.
'Unit 11 시퀀스 자료형 활용하기'에서 리스트, 튜플, range, 문자열은 시퀀스 객체라고 했는데, 이 유닛에서는 반복 가능한 객체라고 했습니다. 시퀀스 객체와 반복 가능한 객체의 차이점은 무엇일까요?
다음 그림과 같이 반복 가능한 객체는 시퀀스 객체를 포함합니다.
리스트, 튜플, range, 문자열은 반복 가능한 객체이면서 시퀀스 객체입니다. 하지만, 딕셔너리와 세트는 반복 가능한 객체이지만 시퀀스 객체는 아닙니다. 왜냐하면 시퀀스 객체는 요소의 순서가 정해져 있고 연속적(sequence)으로 이어져 있어야 하는데, 딕셔너리와 세트는 요소(키)의 순서가 정해져 있지 않기 때문입니다. 따라서 시퀀스 객체가 반복 가능한 객체보다 좁은 개념입니다.
즉, 요소의 순서가 정해져 있고 연속적으로 이어져 있으면 시퀀스 객체, 요소의 순서와는 상관없이 요소를 한 번에 하나씩 꺼낼 수 있으면 반복 가능한 객체입니다.