이터레이터: 값을 순차적으로 꺼내올 수 있는 객체
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']
직접 iter 함수를 출력한 것을 print문을 사용해서 출력하면 이터레이터 객체임을 확인할 수 있다.
print(L.__iter__()) <list_iterator object at 0x10a999210>
이터레이터를 변수에 저장후 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함수를 호출하면 리스트안에 값이 출력이 된다.
print(iterator_L.__next__())
print(iterator_L.__next__())
print(iterator_L.__next__())
print(iterator_L.__next__())
4번 출력을 했는데 리스트이 값을 3개이다. 1,2,3 이 출력되고 StopIteration 이 발생한다.
즉, 리스트의 인덱스를 벗어나서 가져올 값이 없으면 StopIteration이 발생한다.
파이썬 기본함수는 중에 함수를 편하게 사용하게 해주는 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=" ")
Assignment
딕셔너리도 반복가능한 객체라서 앞서본 리스트와 같이 __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}
K = iter(D)
while True :
try :
result = next(K)
except StopIteration:
break
print(result)