티스토리 뷰

python

python3 iterator (이터레이터)

insung151 2019. 1. 9. 22:39
Iterator (이터레이터) : 한번에 하나의 값을 반환하는 객체
iterable : 가지고 있는 값을 한번에 하나씩 반환할 수 있는 객체 (e.g. list, tuple..)

리스트나 튜플은 한번에 모든 값을 반환하므로 iterable 객체이지만 iterator는 아니다. 내장 함수 iter를 사용하면 iterator 객체로 사용할 수 있다.

l =[1, 2, 3, 4]
pritn(type(iter(l)))

----------------------
list_iterator

iterator에서 값을 한개씩 받는 방법

내장 함수 next를 사용한다.

l =[1, 2, 3, 4]
l_iter = iter(l)
print(next(l_iter))
print(next(l_iter))

-----------------------
1
2

파이썬에서 사용하는 for문은 내부적으로 iter 함수를 호출하기 때문에 for문에 리스트를 바로 사용할 수 있다.


위에서 본것 처럼 iterator는 현재 어디까지 반환했는지에 대한 정보를 저장한다. 위의 코드에서 next를 처음 호출했을 때는 1 두번째 호출에서는 2가 출력되었다. 만약 더이상 반환할 값이 없어지면0 StopIteration예외를 발생시킨다.


위에서 사용한 iter 함수에 대해 알아보자


iter 함수가 하는일은 객체를 받아 iterator를 반환해 주는데 입력받은 객체에 있는__iter__함수 또는 __getitem__ 함수를 실행 한다. __getitem__을 호출하는 경우에는 key가 0 부터 시작한다. 즉 객체에 iterator를 반환하는 iter함수가 정의 되어있어야한다.

iter함수에 2번째 인자를 넣게 되면 함수의 기능이 달라진다. 이때 iter함수의 첫번째 인자는 callable 객체이여야한다. 이 경우에는 next 함수를 호출하면 callable 객체가 호출된다. 그리고 만약 객체가 반환하는 값이 2번째 인자의 값과 같아지면 StopIteration 예외가 발생된다. 다음과 같이 사용할 수도 있다.


class RandomIterable:
   def __call__(self):
       return random.randint(1, 10)
   
random_iter = iter(RandomIterable(), 4) # 4가 나오면 종료되는 iterator
 


'python' 카테고리의 다른 글

python3 metaclass(메타클래스)  (0) 2019.01.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함