상단의 이미지는 네이버 영어사전에서 나온 iterator의 뜻이다.
파이썬에서의 iterator의 뜻도 크게 다를바 없다.
파이썬 안에서 iterator란 '반복 가능한 객체'를 의미한다.
L = [1,2,3] 이란 integer들로 이뤄진 평범한 리스트를 한 번 살펴보자.
리스트안에 요소들로는 1,2,3밖에 보이지 않지만 dir 함수를 써보면 그 속에 숨겨진 다양한 함수들이 튀어나오게 된다.
dir 함수 : dir() 내장 함수는 어떤 객체를 인자로 넣어주면 해당 객체가 어떤 변수와 메소드(method)를 가지고 있는지 나열해줍니다. (from WikiDocs)
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']
대부분의 함수들은 built_in(내장)함수들이며, 그 중에서는 __iter__
라는 함수도 보인다. 즉 [1,2,3]은 반복가능한 객체라는 것을 의미한다.
다음과 같이 L을 iterator함수를 써준 후 이를 다시 변수에 저장해보자.
dir함수를 써보면 다음과 같은 next라는 새로운 함수가 생긴것을 볼 수 있다.
Iterator_L = L.__iter__() 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함수는 다음 요소를 하나씩 꺼내오는 함수다. 그러므로 iter함수와 next함수를 이용해 for문 대신 사용을 할 수 있다.
iter함수 next함수 모두 iter(), next() 형태로 사용가능하다. 이는 둘 다 파이썬 자체에 내장되어있는 built_in 모듈이기 때문이다.
iterator를 이용한 while 구문 :
I = iter(L) while True: try: X = next(I) except StopIteration: break print( X**2, end=" ")
결과값 : 1, 4, 9
except를 쓰는 이유는 인덱스 범위를 넘어가면StopIteration
이라는 오류가 발생하기 때문이다. 그러므로 except를 넣어 오류문구를 발생시키지 않게 해주면 깔끔하게 while구문을 완성시킬 수 있다.
문제 :
딕셔너리도 반복가능한 객체라서 앞서본 리스트와 같이 iter함수와 next함수를 사용할 수 있고 파이썬 기본함수인 iter, next 또한 사용할 수 있습니다. 다음의 간단한 키를 출력하는 딕셔너리에 대한 for 문을 while문으로 구현해 보세요.
D = {'a':1, 'b':2, 'c':3} for key in D.keys(): print(key)
해답 :
딕셔너리 D의 키값을 반환하는 for문이므로 iter를 D의 키값으로
지정해주고 next를 통해 반환시키면 된다.
iter(D.keys())대신에 iter(D)로 설정해도 출력값을 동일하게 나오는데 딕셔너리를 반환할때 key가 반환되는게 기본설정이여서 그런것 같다.