티스토리 뷰
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
위에서 사용한 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 |
---|
댓글