Iterator
우선 이터레이터라는 단어는 디자인 패턴에서 많이 듣는다.
Iterator pattern
Single Responsible Principle 을 준수하기 위해 데이터의 저장과 방문의 책임을 분리하여 방문의 책임만을 갖게 하는 패턴을 의미한다.
일반적으로 이 의미와 어느정도 유사한 느낌은 있지만
언어적인 측면에서는 여러개의 값들을 가지고 있는 객체를 의미하는 경우가 대부분이다.
단순하게 생각해서, 모든 값들을 순회(Traverse)할 수 있는 객체를 Iterator로 이해하면 되겠다.
Python에서의 Iterator는 __iter__(), __next__() 메서드를 포함하는 객체를 의미한다.
Iterable objects
Python 에서 iterable한 자료형인
List, tuple, dictionary, set 이 있다.
이들은 iterator 형식으로 iterable 한 컨테이너 이다.
iterate 의 사전적 의미는 반복하다 이다.
Iterator의 사용
이제 어떤 것들이 Iterator인지 알았으니 어떻게 쓰는지 보도록 한다.
예제 코드는 아래처럼 작성 해 보았다.
list = [ 1, 2, 3, 4, 5 ]
for item in list:
print( item )
d = { "A" : 1, "B" : 2 }
for k, v in d.items():
print( k, v )
t = ( "a", "b" )
for item in t:
print( item )
위 코드를 실행하면 아래처럼 iterator 를 순회하여 print 하는 것을 보여준다.
> python3 iterator.py
1
2
3
4
5
A 1
B 2
a
b
그냥 봤을 때 뭐가 iterator 인지 잘 모를 수 밖에 없다. 그냥 배열 같은 자료구조를 루프도는거 아닌가? 정도로 추상적으로 생각할 수 있지만 내부적으로는 그렇지 않다.
for loop 를 사용하였을 때, list, dictionary 같은 iterable 자료구조를 iterator 객체로 만들어 준 뒤, 그 다음에 순회하면서 데이터를 출력하는 것이다.
어떻게 동작하는지 하나하나 보기 위한 코드는 다음과 같다.
list = [ 1, 2, 3, 4, 5 ]
l = iter(list)
while True:
print(next(l))
list를 iter 객체로 만들어 준다.
그리고 우리는 앞에서 __next__() 메서드에 대한 언급이 잠깐 있었던 것을 기억 할 것이다.
이를 통해 다음처럼 리스트 안의 값을 순차적으로 방문이 가능하다.
> python3 iterator.py
1
2
3
4
5
Traceback (most recent call last):
File "/Users/armincho/toy_projects/python3_study/iterator.py", line 9, in <module>
print(next(l))
StopIteration
에러가 났다.
코드의 while문을 일부러 중단없이 돌려 보았고 이를 통해 next 메서드를 list의 끝까지 수행하였을 때 발생하는 Exception을 확인 해 보았다.
작성하는 코드에 따라 예외처리를 해도 되고, 리스트의 크기를 이용하여 방문을 제한하여도 될 것이다.
마치며
오늘은 간단히 Iterable 한 자료형을 Iterator 객체로 만들어 사용하는 방법을 알아 보았다.
Iterator개념은 다른 언어에서도 너무나 널리 쓰이는 개념이니 만큼
알아두면 두고두고 잘 쓸 수 있을 것이다.
물론.. C에서 언어를 시작한 사람이라면
index 접근이랑 무엇이 다르냐 .. 라고 할 수 있겠으나
데이터의 끝까지 갔을때 이상한 주소를 건드려서 Segmentation Fault를 보게 된다면 .. Iterator가 왜 소중한 지 알게 되지 않을 까 싶다.
'CS > Python' 카테고리의 다른 글
[python3] Python 에서 유닛테스트 만들기 - 초보자편 (0) | 2022.11.07 |
---|---|
[python3] Lambda (람다) 함수 개념과 활용법, 장단점 - 쉽고빠른파이썬 (0) | 2022.11.05 |
Python3 print 함수 출력 글자 색 바꿔서 출력하는 방법 (0) | 2022.08.05 |
[파이썬 배우기] python 출력 새로고침, 갱신하면서 출력 하는 방법 (0) | 2022.08.01 |
[파이썬 개발자 로드맵] Functions - 함수 만들어서 사용하는 방법 (0) | 2022.07.04 |