Python - Iterator

Enjoywater·2020년 8월 25일
0

TIL

목록 보기
10/33
post-thumbnail

Iterator

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, 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

로 나타낼 수 있다.


profile
블로그 이전 👉🏻 enjoywater.tistory.com

0개의 댓글