본문 바로가기

Python

[Python] iterable과 iterator

1. Iterable

iterable 객체: 반복 가능한 객체

대표적으로 iterable한 타입 - list, dict, set, str, bytes, tuple, range

collections.iterable에 속한 instance인지의 확인을 통해 iterable 객체인지 판별할 수 있다.

  >>> import collections
    
  # iterable 한 타입
  >>> var_list = [1, 3, 5, 7]
  >>> isinstance(var_list, collections.Iterable)
  True
  >>> var_dict = {"a": 1, "b":1}
  >>> isinstance(var_dict, collections.Iterable)
  True
  >>> var_set = {1, 3}
  >>> isinstance(var_set, collections.Iterable)
  True
  >>> var_str = "abc"
  >>> isinstance(var_str, collections.Iterable)
  True
  >>> var_bytes = b'abcdef'
  >>> isinstance(var_bytes, collections.Iterable)
  True
  >>> var_tuple = (1, 3, 5, 7)
  >>> isinstance(var_tuple, collections.Iterable)
  True
  >>> var_range = range(0,5)
  >>> isinstance(var_range, collections.Iterable)
  True

  # iterable하지 않은 타입
  >>> var_int = 932
  >>> isinstance(var_int, collections.Iterable)
  False
  >>> var_float = 10.2
  >>> isinstance(var_float, collections.Iterable)
  False
  >>> var_none = None
  >>> isinstance(var_none, collections.Iterable)
  False

2. Iterator

iterator 객체: 값을 차례대로 꺼낼 수 있는 객체

파이썬 내장함수 iter()를 사용해 iterator 객체를 만들 수 있다. 

>>> a = [1, 2, 3]
>>> a_iter = iter(a)
>>> type(a_iter)
<class 'list_iterator'>

 

iterable객체는 매직메소드 __iter__ 메소드를 가지고 있다. 이 메소드로 iterator를 생성할 수 있다.

>>> b = {1, 2, 3}
>>> dir(b)
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
>>> b_iter = b.__iter__()
>>> type(b_iter)
<class 'set_iterator'>

 

iterator가 값을 차례대로 꺼낼 수 있는 객체라는 것의 의미를 한번 코드로 살펴보자.

next내장함수를 사용할때 마다 첫번째, 두번째, 세번째 값이 출력된다.

네번째 실행에서는 StopIteration 이라는 예외가 발생한다.

>>> next(a_iter)
1
>>> next(a_iter)
2
>>> next(a_iter)
3
>>> next(a_iter)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

 

iterator 매직 메소드 'next'를 통해 하나씩 값을 꺼낼 수 있다.

>>> b_iter.__next__()
1
>>> b_iter.__next__()
2
>>> b_iter.__next__()
3
>>> 

 

Reference:
https://wikidocs.net/16068

'Python' 카테고리의 다른 글

[Python] enumerate 와 zip  (0) 2022.11.09
[Python] List Comprehension  (0) 2022.11.08
[Python] list 관련 메서드  (0) 2022.09.12
[Python] Object Oriented Programming(OOP)  (0) 2022.05.17
[Python] 'is'와 '=='의 차이  (0) 2022.01.01