[TIL] Python #Iterator

김성진·2020년 8월 24일
0
post-thumbnail

이터레이터는 값을 순차적으로 꺼내올 수 있는 객체 입니다.

Replit에 있는 예제보다 iterator의 기본적 개념을 좀 더 쉽게 이해 할 수 있는 코드:

nums = [7, 8, 9, 5]
it = iter(nums)
print(it.__next__())
print(next(it))

출력값:
7
8

**내가 해석한 iterator란, 기존에 컴퓨터에 print 값을 출력 해내는 개념이었다면, 이건 조금 더 컴퓨터와 커뮤니케이션을 하는 느낌을 줬다. 예시처럼 next라는 함수를 줘서 리스트 안에 값을 차례로 부르는것처럼 말이다.

L이라는 다음 리스트가 있을때 for loop문으로 값마다 제곱을 하는 코드는 다음과 같습니다.

L = [1, 2, 3]
for x in L:
	print(x ** 2, end=' ')

L 리스트가 반복 가능한 객체인지 확인해보는 방법은 dir 로 호출하여 iter 함수가 있는지 확인해볼 수 있습니다.

L=['__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']

dir로 출력해보면 iter 함수가 들어있는 것을 확인할 수 있습니다. 그리고 직접 iter 함수를 출력한 것을 print문을 사용해서 출력해보면 이터레이터 객체임을 확인할 수 있습니다.

print(L.__iter__())
<list_iterator object at 0x10a999210>

이터레이터를 변수에 저장후에 next 함수를 호출하면 for문이 동작하는 것처럼 값을 하나씩 꺼내올 수 있습니다. 우선 dir 로 변수에 저장한 이터레이터를 확인해보겠습니다. print문으로 확인해보면 next 함수가 들어있는 것을 확인할 수 있습니다. 그럼 next 함수는 어떤일을 할 수 있을까요 ? 맞습니다. 다음 요소를 하나씩 꺼내오는 함수 입니다.

iterator_L = L.__iter__()
print("dir iterator_L = ", end=""), print(dir(iterator_L))

dir iterator_L = ['__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__']

next함수를 호출하면서 동작을 확인해보겠습니다. 리스트안에 1,2,3 3개의 값이 들어있으므로 3번이상 호출해보겠습니다. 출력결과를 확인해보세요.

print(iterator_L.__next__())
print(iterator_L.__next__())
print(iterator_L.__next__())
print(iterator_L.__next__())

1,2,3 이 출력되고 StopIteration 이 발생하는 것을 확인할 수 있습니다. 즉, 리스트의 인덱스를 벗어나서 가져올 값이 없으면 StopIteration이 발생하는 것을 알 수 있습니다.

그럼 이제 파이썬 기본함수는 중에 앞에서 알아본 iter함수와 next함수를 편하게 사용하게 해주는 iter와 next에 대하여 알아 보겠습니다. iter는 객체의 iter 함수를 호출해주고 next는 객체의 next 함수를 호출하는 함수 입니다. 위의 L 리스트에 iter와 next를 적용해서 for loop 으로 제곱한 것을 while문으로 구현해보겠습니다.

I = iter(L)
while True:
    try:
        X = next(I)
    except StopIteration:
        break
    print( X**2, end=" ")

딕셔너리도 반복가능한 객체라서 앞서본 리스트와 같이 iter함수와 next함수를 사용할 수 있고 파이썬 기본함수인 iter, next 또한 사용할 수 있습니다. 다음의 간단한 키를 출력하는 딕셔너리에 대한 for 문을 while문으로 구현해 보세요.

D = {'a':1, 'b':2, 'c':3}
for key in D.keys():
    print(key)

**정답:

D = {'a':1, 'b':2, 'c':3}

it = iter(D)
while True:
  try:
    x=next(it)
  except StopIteration:
    break
  print(x)

another example for iteration

class TopTen:
    def __init__(self):
        self.num = 1

    def __iter__(self):
        return self

    def __next__(self):

        if self.num <= 10:
            val = self.num
            self.num += 1

            return val
        else:
            raise StopIteration

values = TopTen()
print(next(values))
profile
multi-national communicator with programming (back-end)

0개의 댓글