상위 목록: 하위 목록: 작성 날짜: 읽는 데 10 분 소요

반복자(Iterator)

반복자(Iterator)반복 가능한(iterable) 형식의 멤버를 순차적으로 반환할 수 있는 객체를 의미합니다.

배열 등의 요솟값을 순차적으로 접근할 때 사용합니다.

배열에서 색인(index)으로 값을 접근할 때는 데이터 메모리 레이아웃에서 배열의 시작 주소값오프셋(offset) 값으로 배열의 요소에 접근합니다.

즉, 배열에 접근할 때에는 배열 요소의 크기개별 요소에 접근하는 방식 등을 모두 고려해 접근합니다.

하지만, 반복자를 사용하면 값이 필요할 때 값을 생성하거나 계산해 반환합니다.

이를 느긋한 계산법(Lazy evaluation)이라 하며, 실제 값이 필요할 때까지 계산을 미루게 되므로 실행 속도 향상과 메모리 사용량을 줄일 수 있습니다.

또한, 데이터 내부 구조접근 방식 등에 상관 없이 요솟값에 접근할 수 있습니다.



반복자(Iterator) 사용하기

import numpy as np

_str = iter("1234")
_tuple = iter((1, 2, 3, 4))
_list = iter([1, 2, 3, 4])
_dict = iter({"a": 1, "b": 2, "c": 3, "d": 4})
_set = iter({1, 2, 3, 4})
_array = iter(np.array([[1, 2], [3, 4]]))

print(next(_str))
print(next(_str))
print(next(_str))
결과
1
2
3

반복자(Iterator)iter() 함수를 통해 반복 가능한 형식의 객체를 생성할 수 있습니다.

iterator 형식의 객체만 가능하며, next() 함수로 다음 번째 요솟값을 참조할 수 있습니다.

next()마다 다음 요솟값을 참조하게 되며, 마지막 요솟값 참조 이후에도 다음 값을 호출하는 경우엔 StopIteration 예외를 발생시킵니다.



반복문과 동시 사용

_dict = iter({"a": 1, "b": 2, "c": 3, "d": 4})

print(next(_dict))

for i in _dict:
    print(i)
결과
a
b
c
d

next() 함수와 반복문 등을 동시에 사용하게 되면, next() 함수를 호출한 것과 동일한 기능을 합니다.

next() 함수로 요솟값에 접근한 다음, 반복자반복문을 사용한다면 이미 앞서서 다음 번째 값을 계산하였기 때문에 순차적으로 출력됩니다.

반복문 이후에 next() 함수로 다음 값을 호출한다면, 더 이상 참조할 값이 없어 StopIteration 예외를 발생시킵니다.



itertools 모듈

from itertools import count

infinite = count()

print(next(infinite))

for i in infinite:
    print(i)
결과
0
1
2

8893


itertools 모듈의 count() 함수를 사용한다면, 크기가 무한한 형태의 반복자를 구현할 수 있습니다.

반복문을 종료하거나 프로세스를 직접 종료하지 않는다면 count가 무한히 증가합니다.

이를 통해, 무한히 반복하거나 매우 큰 횟수의 반복을 구현할 수 있습니다.

  • Tip : infinite = range(10 ** 10000000000000000)의 형태로도 구현이 가능하지만, 앞서 설명한 것처럼 배열을 계산해야하므로 실행까지 큰 시간이 필요하거나 메모리가 부족할 수 있습니다.

댓글 남기기