파이썬 반복문에 대해 뜯어보겠습니다! 쓰더라도 왜 그런지 알고 쓰자 (Iterable, Iterator 중심으로)

Chan Young Jeong·2023년 1월 29일
1
post-thumbnail

학원에서 학생들에게 파이썬 for문에 대해 설명하면서 공부한 내용입니다. 단순히 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한 객체들이 존재합니다. Iterable한 객체란 Iterator를 얻을 수 있는 객체를 Iterable한 객체라고 합니다. 즉, __iter__ 매직 메소드가 존재하는 객체는 Iterable한 객체라고 할 수 있습니다.

확인해 보면 range 내장 함수의 반환값 또한 __iter__ 매직 메소드를 갖고 있기 때문에 iterable한 객체라고 할 수 있습니다.

Iterator 객체

Iterator 객체는 iter함수(__iter__)를 통해 반환되어진 객체이며, 값을 차례대로 꺼내는 기능을 제공하는 객체이다.

  • next 함수를 통해서, 객체를 전달하며 저장된 값을 하나씩 꺼낼 수 있게된다.
  • 마지막까지 값을 얻었는데, next 함수를 호출하고나면, StopIteration 예외가 발생한다.
  • 만약 처음부터 값을 다시 얻고 싶으면 어떻게 해야할까? iterator 객체를 새롭게 다시 얻으면 된다.

For문 동작 과정

그렇다면 for문의 구체적인 동작과정은 다음과 같다.

  • 가장 먼저 in 뒤에 온 객체가 iterable한 객체인지 확인합니다.
    만약 iterable한 객체가 아니라면 TypeError가 발생합니다.
  • iterable한 객체라면 iter를 호출하여 이터레이터 객체를 생성합니다.
  • 생성된 iterator를 통해 next를 호출하다가 StopIteration이 발생하면 반복이 종료되게 됩니다.

참고 | 시퀀스 객체와 반복 가능한 객체의 차이

'Unit 11 시퀀스 자료형 활용하기'에서 리스트, 튜플, range, 문자열은 시퀀스 객체라고 했는데, 이 유닛에서는 반복 가능한 객체라고 했습니다. 시퀀스 객체와 반복 가능한 객체의 차이점은 무엇일까요?

다음 그림과 같이 반복 가능한 객체는 시퀀스 객체를 포함합니다.

리스트, 튜플, range, 문자열은 반복 가능한 객체이면서 시퀀스 객체입니다. 하지만, 딕셔너리와 세트는 반복 가능한 객체이지만 시퀀스 객체는 아닙니다. 왜냐하면 시퀀스 객체는 요소의 순서가 정해져 있고 연속적(sequence)으로 이어져 있어야 하는데, 딕셔너리와 세트는 요소(키)의 순서가 정해져 있지 않기 때문입니다. 따라서 시퀀스 객체가 반복 가능한 객체보다 좁은 개념입니다.

즉, 요소의 순서가 정해져 있고 연속적으로 이어져 있으면 시퀀스 객체, 요소의 순서와는 상관없이 요소를 한 번에 하나씩 꺼낼 수 있으면 반복 가능한 객체입니다.

출처

코딩 도장1
코딩 도장2

0개의 댓글