Python - Iterator와 Iterable의 차이점

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

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

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

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

1. 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

1.1 Example

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

string = "Hello!"

for ch in string:
    print(ch)

Output:

H
e
l
l
o
!

2. 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

2.1 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

3. 객체가 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

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha