Iterator란 wikipedia에 따르면,
객체 지향적 프로그래밍에서 배열이나 그와 유사한 자료 구조의
내부의 요소를 순회하는 객체
이다.
라고 정의되어있다.
값을 차례대로 꺼낼 수 있는 객체
이며, 내장함수 또는 iterable객체의 메소드
로 객체
를 생성할 수 있다.
Iterable객체
는 반복 가능한 객체를 의미하며,
대표적으로 list
, dict
, set
등이 있다.
아래 코드는 기본적으로 사용하는 for loop문 코드이다.
test_li = [0, 1, 2, 3, 4, 5]
for ele in test_li:
print(ele + 10)
# 결과값 -> 10
# 11
# 12
# 13
# 14
# 15
해당 코드 속 test_li가 Itarable객체인지 확인을 하기위해서 dir()
함수로 확인해보면,
print(dir(test_li))
# 결과값 ->
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__',
'__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__',
'__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
'__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
많은 요소들 중에 __iter__
라는 이름을 찾을 수 있다.
해당 함수를 호출해서 다시한번 확인해보면,
print(test_li.__iter__())
print(dir(test_li.__iter__())) # 반드시 __iter__() 로 호출해서 확인!
# 결과값 ->
<list_iterator object at 0x7fadcf13e280>
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__iter__', '__le__', '__length_hint__',
'__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__',
'__subclasshook__']
list_iterator 객체이며, 그 속에 __next__
함수를 가지고 있는 것을 볼 수 있다.
__next__
함수는 이름 그대로 그 다음의 요소를 하나씩 꺼내오는 함수이다.
test_li를 변수에 담고 __next__
함수를 여러번 실행시켜보면,
test_li = [0, 1, 2, 3, 4, 5]
result = test_li.__iter__()
print(result.__next__())
print(result.__next__())
print(result.__next__())
print(result.__next__())
print(result.__next__())
print(result.__next__())
print(result.__next__())
# 결과값 -> 0
# 1
# 2
# 3
# 4
# 5
# StopIteration
list 요소를 모두 꺼내온 후에, StopIteration
이 발생하는 것을 볼 수 있다.
즉, index
를 벗어난 시점에서 가져올 값이 없다면 StopIteration
이 발생하는 것이다.
위에서 보았던 __iter__
, __next__
함수를 더 편하게 사용하게 도와주는 iter
, next
함수가 있다.
iter
함수는 객체의 __iter__
함수를 호출해준다.next
함수는 객체의 __next__
함수를 호출해준다.해당 함수를 사용해서 위에서 봤던 코드를 변경해보면,
test_li = [0, 1, 2, 3, 4, 5]
test_iter = iter(test_li)
while True:
try:
print(next(test_iter) + 10)
except:
break
# 결과값 -> 10
# 11
# 12
# 13
# 14
# 15
로 나타낼 수 있다.