Python - Iterator와 Iterable의 차이점

By JS | Last updated: July 28, 2021

Iterator와 Iterable은 List 같은 자료구조에 저장된 데이터를 순차적으로 접근하는 객체입니다.

하지만 다음과 같은 차이점이 있습니다.

  • Iterable은 List처럼 데이터를 순회할 수 있는 객체입니다.
  • Iterator는 Iterable 객체를 순회하는 객체입니다.
  • Iterable은 iter() 메소들로 Iterator 객체를 생성할 수 있습니다.
  • Iterator는 __next__() 메소드로 Iterable의 데이터에 순차적으로 접근할 수 있습니다.
  • Iterator 객체는 항상 Iterable 객체가 됩니다. 하지만 Iterable 객체는 Iterator 객체가 될 수 있지만 아닐 수도 있습니다.

예제를 통해 자세히 알아보겠습니다.

Iterable 순회

List는 Iterable입니다.

다음 코드는 반복문으로 List를 모든 요소를 순회하는 예제입니다. for loop 내부적으로 iter() 메소드를 호출하여 Iterator 객체를 얻고, Iterator의 __next__()를 호출하여 모든 요소를 탐색합니다.

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

for item in my_list:
    print(item)

Output:

a
b
c
d

Example 2

문자열도 Iterable입니다. 문자열을 순회할 때, 문자 1개씩 접근합니다.

string = "Hello!"

for ch in string:
    print(ch)

Output:

H
e
l
l
o
!

Iterator 객체로 List 순회

  • iter()는 Iterable 객체로부터 iterator 객체를 생성하는 메소드입니다.
  • next()는 Iterator의 __next__()를 호출하는 built-in 메소드입니다.

아래 코드는 Iterable에서 Iterator를 생성하고, 그 Iterator로 리스트를 순회합니다. next()를 4번 호출하여 4개의 아이템을 모두 순회합니다.

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

iterator = iter(my_list)

print(next(iterator))
print(next(iterator))
print(next(iterator))
print(next(iterator))

Output:

a
b
c
d

StopIteration 예외

위의 예제에서 next()를 4번 호출하면 모든 요소를 탐색하게 됩니다. 만약 next()를 5번째 호출하게 되면 StopIteration 예외가 발생시킵니다.

Traceback (most recent call last):
  File "/home/mjs/IdeaProjects/python-ex/iterator.py", line 14, in <module>
    print(next(iterator))
StopIteration

객체가 Iterable인지 확인

어떤 객체가 iter()로 Iterator 객체를 생성할 수 있으면 Iterable 객체입니다. 이것으로 Iterable 객체인지 확인할 수 있습니다.

다음은 여러 객체들에 대해서 Iterable인지 확인하는 예제입니다.

def iterable(obj):
    try:
        iter(obj)
        return True
    except TypeError:
        return False


items = [34, [4, 5], (4, 5), {"a":4}, "dfsdf", 4.5]
for element in items:
    print(element, "is iterable:", iterable(element))

Output:

34 is iterable: False
[4, 5] is iterable: True
(4, 5) is iterable: True
{'a': 4} is iterable: True
dfsdf is iterable: True
4.5 is iterable: False

References

Related Posts

댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha