Doby's Lab

Python의 Iterator에 대하여 본문

Code about AI/Python

Python의 Iterator에 대하여

도비(Doby) 2023. 1. 9. 23:49

파이썬의 Iterator라는 개념이 존재합니다. 이를 알기 위해서는 Iterable Object에 대해 먼저 알아야 합니다.


Iterable Object

파이썬의 모든 것은 객체로 이루어져 있습니다. 때문에 Iterable Object라는 것은 '반복가능한 데이터'로 해석할 수 있습니다.

 

Iterable Object 중 가장 익숙한 것이 list, string 등 여러 가지가 있습니다.

li = [1, 2, 3, 4, 5]

list를 보면 for loop를 통해 element에 접근할 수 있습니다.

for element in li:
    print(element)

즉, for loop로 element를 하나하나 리턴할 수 있는 객체를 Iterable Object라고 합니다.


Iterator

Iterator란 iterable object를 iter()를 통해 만든 객체입니다.

둘 다 반복 가능한 건 같은데 뭐가 다를까요?

 

Iterator를 선언하면 iterable object의 element를 순서대로 가져올 수 있습니다.

 

Iterator는 인덱싱을 할 수 없으며 무조건 순서대로 가져오고, 한 번 쓴 데이터는 다시 쓸 수 없습니다.

 

그러면 단점밖에 없는 Iterator를 쓸 이유가 없습니다. 그럼에도 불구하고 쓰는 이유는

Iterator는 순서대로 데이터를 가져온 후에 즉각적으로 데이터를 폐기시키기 때문에 대규모 데이터처리에 있어서 매우 효과적이기 때문입니다.

 

데이터를 순서대로 가져오는 방법은 next()라는 함수를 써서 가져올 수 있습니다.

iterable 하기 때문에 for loop를 이용해서도 가져올 수 있습니다. 물론, next()와 똑같이 한 번쓰고 나면 데이터를 쓸 수 없습니다.

li_iter = iter(li)

print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))

만약 iterator가 더 이상 가져올 데이터가 없을 때는 어떻게 될까요?

li_iter = iter(li)

print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))
print(next(li_iter))

Traceback (most recent call last):
  File "main.py", line 10, in <module>
    print(next(li_iter))
StopIteration

위와 같은 StopIteration이라는 에러가 뜹니다. 이러한 경우에는 아래와 같이 Except 처리를 해주면 되죠.

li_iter = iter(li)

while True:
    try:
        data = next(li_iter)
        print(data)
    except StopIteration:
        print('End')
        break

 

또한, iter()과 next()에 대해 재밌는 사실이 있습니다.

iter()는 Iterable Object의 메서드 __iter__()와 같은 역할을 합니다.

그리고, next()는 Iterator의 메서드 __next__()와 같은 역할을 합니다.

즉, 아래 코드는 같은 것을 의미한다는 뜻이기도 합니다.

li_iter = iter(li)
print(next(li_iter))

li_iter = li.__iter__()
print(li_iter.__next__())

 

그리고, Iterator는 next()를 호출하면서 데이터를 즉각적으로 가져오기 때문에 len()이나 인덱싱을 할 수 있는 subscriptable한 객체가 아닙니다.

호출할 때마다 데이터를 가져온다라는 Iterator의 특성을 기억해두고 있으면 이해하기 쉽습니다.

TypeError: object of type 'list_iterator' has no len() # len()
TypeError: 'list_iterator' object is not subscriptable # indexing

Reference

https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=youndok&logNo=222073036603 

 

파이썬 iterable과 iterator - iter() 및 next() 함수

본 포스팅에서는 Python의 "iterable 한 객체"와 "iterator 객체"의 의미를 알아보고...

blog.naver.com

728x90