본문 바로가기

카테고리 없음

Python : Iterator와 Iterable의 차이 완벽 이해하기

핵심 요약

Iterable 은 반복이 가능한 객체로, for 루프와 함께 사용할 수 있는 객체입니다. __iter__() 메서드를 가지고 있으며, 이를 통해 iterator 객체를 반환합니다. Iterator 는 반복 작업을 실제로 수행하는 객체로, __next__() 메서드를 사용해 순차적으로 값을 반환합니다. 더 이상 반환할 값이 없을 때 StopIteration 예외를 발생시킵니다. 즉, Iterable 객체가 실제 반복 작업으로 값을 반환하기 위해서 Iterator 객체를 사용한다고 보시면 되겠습니다.

 

Iterable과 Iterator의 자세한 차이

1. 정의

Iterable은 반복이 가능한 객체로 리스트, 튜플, 문자열과 같은 Python의 기본 자료형들은 모두 iterable입니다. __iter__() 메서드를 통해 iterator를 반환하기 때문에 어떤 객체가 Iterable 인지 아닌지를 판단하기 위해서는 아래와 같은 방법들로 해당 메서드 존재여부를 확인해 보시면 됩니다. 

t = 'ABCDE'                         #문자열은 iterable

print(dir(t))                       #내부함수를 리스트로 표현. 목록에 __iter__ 확인
print(hasattr(t,'__iter__'))        #True

from collections import abc         #abc는 추상클래스
print(isinstance(t,abc.Iterable))   #True

 

Iterator__iter__()__next__() 메서드를 모두 구현하는 객체로, 반복 가능한 값을 차례로 반환하고, 반환할 값이 없으면 StopIteration 예외를 발생시켜 반복을 종료합니다.  iter 함수와 next() 함수를 사용하여 이를 증명해 볼 수 있습니다.

t = 'ABCDE'     #iterable 문자열
it = iter(t)    #iterator 생성

while True:
    try:
        print(next(it))
    except StopIteration:
        break
#output : 
A
B
C
D
E

 

즉,  for loop를 사용하면 위와 같은 실행이 내부적으로 반복 수행된다고 보시면 됩니다. 

 

동작 원리

Iterable 객체는 __iter__() 메서드로 iterator를 생성하고, 생성된 iterator를 통해 순차적으로 값을 조회합니다.

Iterator는 __next__() 메서드를 호출할 때마다 다음 값을 반환하며, 끝에 도달하면 StopIteration을 발생시킵니다.

 

다만, Iterable은 반복가능한 객체를 의미하기 때문에  몇 번이고 For loop를 돌려서 값을 빼올 수 있지만, Iterator 는 iterable 객체가 반복 수행을 위해 일회성으로 만들어주는 객체이기 때문에 StopIteration이 발생한 이후에는 더 반복을 할 수가 없습니다.

t = 'ABCDE'         #iterable

for c in t:
    print('1:',c)   #1:A 1:B 1:C 1:D 1:E

for c in t:
    print('2:',c)   #2:A 2:B 2:C 2:D 2:E
    
it = iter(t)        #iterator

for c in it:
    print('1:',c)   #1:A 1:B 1:C 1:D 1:E

for c in it:
    print('2:',c)   #No output

 

이는 사용자 정의 Iterator를 사용하여도 동일하게 적용됩니다.

# Iterator 예제: 사용자 정의 iterator
class Counter:
    def __init__(self, max_count):
        self.max_count = max_count
        self.current = 1

    def __iter__(self):
        return self  # 스스로를 iterator로 반환

    def __next__(self):
        if self.current <= self.max_count:
            result = self.current
            self.current += 1
            return result
        else:
            raise StopIteration  # 반복 종료

# Counter iterator 생성 및 사용
counter = Counter(3)
for count in counter:
    print('1:',count)		#1:A 1:B 1:C 1:D 1:E

for count in counter:
    print('2:',count)		#No output

 

결론:

Iterable은 반복 가능한 객체를 의미하며, iterator는 이러한 iterable 객체에서 요소를 하나씩 가져오는 데 사용됩니다. iterable은 iterator를 반환할 수 있으며, iterator는 실제로 값을 순차적으로 반환하는 역할을 담당합니다. 이 두 개념은 Python에서 반복 작업을 유연하고 효율적으로 수행하는 핵심 요소입니다.