Python

[Python] iterable와 iterator

비번변경 2024. 10. 14. 22:55

개요

평소 list나 set 등을 iterable 한 객체라고 말해왔는데, 관련 개념을 조금 더 명확하게 정리할 필요가 있어서 정리한다.

 

 

iterable

iterable이란 멤버들을 순회할 수 있는 객체를 의미한다. 순회당하는 객체를 iterable 하다고 말하며, Python에서는 list, string, drictionary, tuple, set 등이 해당된다.

참고로  __iter__() 함수를 가진 객체는 전부 iterable에 해당하고, 다음과 같은 코드로 객체가 iterable인지 확인할 수도 있다.

from typing import Iterable

print(isinstance(list(), Iterable))
print(isinstance(set(), Iterable))
print(isinstance(int(0), Iterable))

또한 직접 정의한 클래스에 __iter__ 함수를 오버라이딩하면 그 클래스의 객체도 iterable에 해당된다.

 

 

iterator

iterator는 iterable 객체를 대상으로 순회를 수행하는 객체에 해당하며 힌 번에 한 항목씩 데이터를 반환하는 기능, 현재의 항목과 방문한 항목을 추적하는 기능을 제공한다.

일반적으로는 for문이 수행될 때 내부적으로 iterator를 사용하여 객체를 순회하게 되므로 iterator를 직접 다룰 일은 많지 않다. iterator를 직접 다뤄야 하는 상황에서는 객체 내__iter__() 함수 또는 Python 내장 함수인 iter() 함수로 iterator 객체를 생성한 후, __next__() 함수를 반복하여 호출하면서 iterable 객체를 순회하게 된다.

list_data = range(3)

# iterator 초기화
iter_data = list_data.__iter__()

# 데이터 순회
print(iter_data.__next__())
print(iter_data.__next__())
print(iter_data.__next__())

 

__iter__ 함수로 생성된 iterator는 iterable 객체의 첫 번째 원소를 가리키는데

, __next__ 함수를 호출할 때마다 현재 가리키는 값을 반환하고 다음 원소를 반환하는 방식으로 동작하게 된다.

만약 더 이상 다음 데이터를 반환할 수 없게 되면 StopIeteration 에러가 발생한다.

 

 

참고 문서

https://realpython.com/python-iterators-iterables/

https://wikidocs.net/16068

[파이썬] iterable과 iterator 의 차이가 뭐예요?