본문 바로가기

카테고리 없음

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에서 반복 작업을 유연하고 효율적으로 수행하는 핵심 요소입니다.