iterable
python에서 'iterable 하다'라는 의미는 뜻 그대로 '반복 가능한' 것을 의미하며, 반복 가능한 데이터 즉, 객체에 적용되는 의미입니다. 반복가능한 객체의 종류로는
- 순서형 및 컬렉션 데이터 타입 : string, list, tuple, dict, set, range() 함수객체
- 그 외 : 파일, class로 컬렉션 데이터로 정의된 객체 등
iterator
이터레이터는 순서대로 다음 값을 리턴할 수 있는 객체를 의미합니다. 자체적으로 내장하고 있는 next 메소드를 통해 다음 값을 가져올 수 있습니다.
여기서 '순서대로'라는 말 때문에 list, tuple과 같은 타입의 객체를 생각하셨을 수도 있는데, 이것과는 다릅니다.
iterable vs iterator
내부 요소(member)를 하나씩 리턴할 수 있는 객체를 보고 Iterable하다고 합니다. 쉽게 생각하면 우리가 평소에 많이 사용하는 for문을 떠올리시면 됩니다.
_list = [1,2,3,4,5]
for i in _list:
print(i)
이렇게 for문을 통해 순회할 수 있는 객체를 Iterable하다고 생각하시면 됩니다. 대표적으로 위에서 잠깐 설명한 시퀀스 타입과 컬렉션 타입의 객체가 있습니다.
그럼 Iterable한 것과 Iterator는 무슨 차이가 있는걸까요?
쉽게 말하자면 Iterable한 것은 __next__ 메소드가 존재하지 않고 Iterator는 존재한다고 생각하시면 됩니다.
즉 __next__ 메소드로 다음 값을 반환할 수 있으면 Iterator, 없으면 Iterable한 객체입니다.
iterable 객체를 iteraotor로 변환 가능
주목할 점은, Iterable한 객체를 Iterator로 만들 수 있다는 점입니다.(정확히는 내부에 __iter__라는 메소드가 있는 객체)
예제와 함께 살펴봅시다.
a = [1, 2, 3]
print(a.__next__) # AttributeError 발생
그냥 list 타입의 데이터는 __next__ 메소드가 없습니다. 따라서 에러가 발생합니다.
a = [1, 2, 3]
print(type(a)) # list 출력
a = iter(a)
print(type(a)) # list_iterator 출력
print(a.__next__()) # 첫 실행시 1 출력
하지만 이렇게 iter함수를 이용해 Iterator로 만들어 줄 수 있습니다.
Iterator로 바꾼 후에는 정상적으로 __next__함수가 작동하는 것을 볼 수 있습니다.
a = [1, 2, 3].__iter__()
print(type(a)) # list_iterator
또는 이렇게 직접 __iter__ 메소드를 호출해 Iterator로 만들어 줄 수도 있습니다.
a = [1, 2, 3]
a = iter(a)
print(a.__next__()) # 1 출력
print(a.__next__()) # 2 출력
print(a.__next__()) # 3 출력
print(a.__next__()) # StopIteration Exception 발생
저 __next__메소드를 이용해서 값을 계속 꺼내다보면 마지막 값에 도달하게 되는데, 마지막 값을 꺼내고 나서 __next__메소드를 호출하면 StopIteration이라는 예외가 발생합니다.
for문과 iterator
눈치채신 분도 계시겠지만 파이썬의 for문은 내부적으로 Iterator를 생성하여 동작합니다.(__iter__ 메소드 이용)
예를들어 리스트를 순회하는 for문이라 하면, 해당 리스트의 Iterator를 생성한 다음 __next__메소드를 이용해 순회를 도는 방식입니다.
대충 그림으로 표현하자면 다음과 같습니다.
StopIteration 예외가 발생하면 순회를 마칩니다.
'Python' 카테고리의 다른 글
[python] from glob import glob (0) | 2022.08.31 |
---|---|
[python] argparse 사용법 (0) | 2022.08.26 |
[python] 함수 파라미터 args, kwarg (0) | 2022.08.26 |
[네이버부스트코스] 모듈, 패키지, 프로젝트 (0) | 2022.07.23 |
[네이버부스트코스] Numpy Numerical Python (0) | 2022.07.21 |