본문 바로가기
ETC

[python] iterable 과 iterator 의 의미와 차이

by dkswnkk 2021. 11. 3.

Iterable 객체

  • 반복 가능한 객체
  • 대표적으로 iterable한 타입 - list, dict, set, str, bytes, tuple, range
  • iter()메소드에 전달될 때 Iterator를 생성한다.

Iterable한 타입을 확인하는 방법

  • collection.Iterable에 속한 instance인지 확인: isinstance 함수는 첫 번째 파라미터, 두 번째 파라미터 클래스의 instance 이면 True를 반환
import collections.abc

# iterable 타입

var_list = [1, 3, 5 ,7]
print(isinstance(var_list, collections.Iterable))   # 출력: True

var_dict = {"a": 1, "b": 1}
print(isinstance(var_dict, collections.Iterable))   # 출력: True

var_set = {1, 3}
print(isinstance(var_set, collections.Iterable))    # 출력: True

var_str = "abc"
print(isinstance(var_str, collections.Iterable))    # 출력: True

var_bytes = b'abcdef'
print(isinstance(var_bytes, collections.Iterable))  # 출력: True

var_tuple = (1, 3, 5, 7)
print(isinstance(var_tuple, collections.Iterable))  # 출력: True

var_range = range(0, 5)
print(isinstance(var_range, collections.Iterable))   # 출력: True

 

Iterator 객체

  • 하나 이상의 항목이 포함되어 있는 자료구조에서 데이터를 차례대로 꺼낼 수 있는 객체
  • iterator는 iterable한 객체를 내장 함수 또는 iterable 객체의 메소드로 객체를 생성할 수 있음

Iterator는 __next__() 메서드를 가지며, 반복 가능한 객체를 반복하는 데 사용하는 객체이고, 다음 순서의 item값을 반환한다. 모든 iterator는 iterable이지만, 모든 iterable이 iterator는 아니다.

ex) list 객체자체는 iterable이지만 iterator가 아님

test_list = ['a','b','c','d']

print(test_list)    # 출력: ['a', 'b', 'c', 'd']
print(next(test_list))  # error: TypeError: 'list' object is not an iterator

예를 들어 위 코드의 마지막 문장에서 next() 메소드를 이용하면 test_list는 list 이기에 iterator가 아니어서 TypeError를 뱉어낸다.

 

Iterable 객체를 iterator 객체로 변환

모든 Iterable한 객체에 파이썬 내장 함수 iter()를 사용해 iterator 객체로 만들 수 있다.

test_list = ['a','b','c','d']

test_iter = iter(test_list)

print(test_iter)    # 출력: <list_iterator object at 0x117c3d640>

print(next(test_iter))  # 출력: a
print(next(test_iter))  # 출력: b
print(next(test_iter))  # 출력: c
print(next(test_iter))  # 출력: d

print(next(text_iter))  # 에러: StopIteration => 5번째 iter는 없기 때문

next() 내장함수는 인자가 되는  Iterator의 다음 인자를 반환하고 위치를 다음으로 옮기는 기능을 한다.

iterable이었던 test_list를 iter()메소드를 사용해 변환하여 담은 test_iter 객체는 이제 itertor이기 때문에 next() 메소드를 이용했을 때 오류 없이 출력이 된다.

댓글