Post

파이썬 - 이터러블 객체



간단하게 파이썬에서의 순회 가능한 객체(이터러블)와 그 종류에 대해 살펴보자.

이 구분을 좀 명확히 정리하고 넘어가고 싶어서 오랜만에 블로그 글을 작성 중이다.

이터러블(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 시퀀스 객체의 특징

  1. 인덱싱 가능 (Indexable)

    • 시퀀스의 각 요소는 인덱스를 통해 접근할 수 있다.
  2. 슬라이싱 가능 (Slicable)

    • 시퀀스의 일부를 슬라이싱(slicing)하여 새로운 시퀀스를 만들 수 있다.
  3. 길이 (Length)

    • len() 함수를 사용하여 시퀀스의 길이를 알 수 있다.
  4. 멤버십 테스트 (Membership Test)

    • in 키워드를 사용하여 특정 값이 시퀀스에 포함되어 있는지 확인할 수 있다.
  5. 연결 (Concatenation)

    • + 연산자를 사용하여 두 시퀀스를 연결할 수 있다.
  6. 반복 (Repetition)

    • * 연산자를 사용하여 시퀀스를 반복할 수 있다.
  7. 정렬 가능 (Sortable)

    • 시퀀스는 sorted() 함수를 사용하여 정렬할 수 있다.

2. 비시퀀스 이터러블 (Non-sequence Iterables)

시퀀스처럼 인덱스로 접근할 수 없지만(순서가 없거나, 그 순서를 보장하지 않음), __iter__() 메서드를 통해 반복 가능한 객체다.

2.1 비시퀀스 이터러블 객체의 종류

  • 집합 (set, frozenset)
  • 딕셔너리 (dict)

2.2 비시퀀스 이터러블 객체의 특징

  1. 순서 없음 (Unordered)

    • 요소들이 특정 순서를 따르지 않는다.
  2. 인덱싱 불가 (Non-indexable)

    • 인덱스를 통해 요소에 접근할 수 없다.
  3. 멤버십 테스트 (Membership Test)

    • in 키워드를 사용하여 요소의 존재 여부를 확인할 수 있다.
  4. 빠른 조회 (Fast Lookup)

    • 해시 테이블을 사용하여 요소의 존재 여부를 빠르게 확인할 수 있다.

3. 이터레이터 (Iterators)

__iter__()__next__() 메서드를 구현한 객체로, 호출할 때마다 다음 요소를 반환한다.

이 이터레이터의 중요한 특징은, 한 번 꺼낸 요소(순회한 요소)는 소모된다는 것이다. 그리고 더 이상 요소가 없을 때 StopIteration 예외를 발생시킨다.

3.1 이터레이터 객체의 종류

  • 제너레이터 함수 및 제너레이터 표현식 (generators)
  • 파일 객체 (file objects)
  • 내장 이터레이터 (map, filter, zip, enumerate 등이 반환하는 객체)
  • 사용자 정의 이터레이터 클래스

3.2 이터레이터 객체의 특징

  1. 소모성 (Consumable)

    • 한 번 순회한 요소는 다시 사용할 수 없다. 즉, 한 번 사용한 이터레이터는 재사용할 수 없다.
  2. 상태 유지 (Stateful)

    • 이터레이터는 현재 위치를 기억하고 있으며, next() 호출 시 다음 요소를 반환한다.
  3. StopIteration 예외 (StopIteration Exception)

    • 더 이상 반환할 요소가 없으면 StopIteration 예외를 발생시킨다.
This post is licensed under CC BY 4.0 by the author.