파이썬 - 이터러블 객체
간단하게 파이썬에서의 순회 가능한 객체(이터러블)와 그 종류에 대해 살펴보자.
이 구분을 좀 명확히 정리하고 넘어가고 싶어서 오랜만에 블로그 글을 작성 중이다.
이터러블(Iterable) 객체란?
__iter__()
메서드를 구현하여 이터레이터를 반환할 수 있는 객체 또는 __getitem__()
메서드를 구현하여 요소를 하나씩 반환할 수 있는 객체로, for
루프나 iter()
함수를 사용해 순회할 수 있다.
순회 가능하다는 게 포인트다.
이터러블 객체의 종류
1. 시퀀스 (Sequences)
‘순서’대로 나열된 이터러블 객체다. 인덱스로 요소에 접근할 수 있으며, __getitem__()
메서드를 통해 접근하게 된다.
1.1 시퀀스 객체의 종류
- 리스트 (
list
) - 튜플 (
tuple
) - 문자열 (
str
) - 바이트 (
bytes
) - 바이트 배열 (
bytearray
) - 레인지 (
range
)
나는 이제껏 range
가 제너레이터(이터레이터의 일종)인 줄 알았다. 하지만 range
는 시퀀스 객체다.
https://docs.python.org/3/library/stdtypes.html#typesseq
1.2 시퀀스 객체의 특징
인덱싱 가능 (Indexable)
- 시퀀스의 각 요소는 인덱스를 통해 접근할 수 있다.
슬라이싱 가능 (Slicable)
- 시퀀스의 일부를 슬라이싱(slicing)하여 새로운 시퀀스를 만들 수 있다.
길이 (Length)
len()
함수를 사용하여 시퀀스의 길이를 알 수 있다.
멤버십 테스트 (Membership Test)
in
키워드를 사용하여 특정 값이 시퀀스에 포함되어 있는지 확인할 수 있다.
연결 (Concatenation)
+
연산자를 사용하여 두 시퀀스를 연결할 수 있다.
반복 (Repetition)
*
연산자를 사용하여 시퀀스를 반복할 수 있다.
정렬 가능 (Sortable)
- 시퀀스는
sorted()
함수를 사용하여 정렬할 수 있다.
- 시퀀스는
2. 비시퀀스 이터러블 (Non-sequence Iterables)
시퀀스처럼 인덱스로 접근할 수 없지만(순서가 없거나, 그 순서를 보장하지 않음), __iter__()
메서드를 통해 반복 가능한 객체다.
2.1 비시퀀스 이터러블 객체의 종류
- 집합 (
set
,frozenset
) - 딕셔너리 (
dict
)
2.2 비시퀀스 이터러블 객체의 특징
순서 없음 (Unordered)
- 요소들이 특정 순서를 따르지 않는다.
인덱싱 불가 (Non-indexable)
- 인덱스를 통해 요소에 접근할 수 없다.
멤버십 테스트 (Membership Test)
in
키워드를 사용하여 요소의 존재 여부를 확인할 수 있다.
빠른 조회 (Fast Lookup)
- 해시 테이블을 사용하여 요소의 존재 여부를 빠르게 확인할 수 있다.
3. 이터레이터 (Iterators)
__iter__()
와 __next__()
메서드를 구현한 객체로, 호출할 때마다 다음 요소를 반환한다.
이 이터레이터의 중요한 특징은, 한 번 꺼낸 요소(순회한 요소)는 소모된다는 것이다. 그리고 더 이상 요소가 없을 때 StopIteration
예외를 발생시킨다.
3.1 이터레이터 객체의 종류
- 제너레이터 함수 및 제너레이터 표현식 (
generators
) - 파일 객체 (
file objects
) - 내장 이터레이터 (
map
,filter
,zip
,enumerate
등이 반환하는 객체) - 사용자 정의 이터레이터 클래스
3.2 이터레이터 객체의 특징
소모성 (Consumable)
- 한 번 순회한 요소는 다시 사용할 수 없다. 즉, 한 번 사용한 이터레이터는 재사용할 수 없다.
상태 유지 (Stateful)
- 이터레이터는 현재 위치를 기억하고 있으며,
next()
호출 시 다음 요소를 반환한다.
- 이터레이터는 현재 위치를 기억하고 있으며,
StopIteration 예외 (StopIteration Exception)
- 더 이상 반환할 요소가 없으면
StopIteration
예외를 발생시킨다.
- 더 이상 반환할 요소가 없으면