-iterator: 값을 차례로 꺼낼 수 있는 객체(object)
-파이썬에선 이터레이터만 생성하고 값이 필요한 시점이 되었을 떄 값을 만드는 방식 사용
-데이터 생성을 이처럼 미루는 방식을 지연 평가(lazy evaluation)이라 함.
-반복자라고 부르기도 함.
-문자열, 리스트, 딕셔너리, 세트 등이 반복 가능한 객체
-반복 가능한 객체 확인법: iter메서드가 들어있는지 확인하면 됨.
문법: dir(객체)
print(dir([1,2,3]))
['__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']
-변수에 이터레이터를 저장한 뒤 __next__()
메서드를 호출하면 요소를 차례대로 꺼낼 수 있따. 만약 더이상 꺼낼 요소가 없다면 StopIteration 예외를 발생시켜 반복을 끝낸다.
it = [1,2,3].__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())
결과
1
2
3
it = [1,2,3].__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
결과
File "C:/Users/KIM HWANIL/PycharmProjects/scrapper/bakjoon.py", line 5, in <module>
print(it.__next__())
StopIteration
class hi:
def __init__(self, stop):
self.stop = stop
def __getitem__(self, index):
if index < self.stop:
return index
else:
raise IndexError
print(hi(3)[0], hi(3)[1], hi(3)[2])
for i in hi(3):
print(i, end = ' ')
결과
0 1 2
0 1 2
-iter는 반복 가능한 객체에서 이터레이터 반환
-next는 이터레이터에서 값을 하나 씩 꺼냄
it = iter(range(3))
print(next(it))
print(next(it))
print(next(it))
결과
0
1
2
print(next(it))를 4번째 호출하면 오류 발생(range는3이기 때문)
-iter는 반복을 끝낼 값 지정할 수 있다.
-이 경우 반복 가능 객체 대신 호출 가능 객체(callable) 넣어줌.
-반복 끝낼 값을 sentinel이라 부름(감시병)
문법 iter(호출가능객체, 반복끝낼값)
import random
it = iter(lambda : random.randint(0,6), 2)
print(next(it))
print(next(it))
-위 코드는 2가 나올 떄 까지 next호출 가능, 그 다음부턴 오류
-같은 코드를 for반복문 사용해 만들기
import random
for i in iter(lambda: random.randint(0,5), 2):
print(i, end = ' ')
결과: 0 4 1 5 등 2가 나올 때 까지 숫자 나옴.
-같은 코드를 while문 써서 만들기
import random
while True:
i = random.randint(0,5)
if i ==2:
break
print(i, end=' ')
-next는 기본값 지정 가능, 반복 끝나면 기본값을 계속 출력한다
next(반복가능객체, 기본값)
it = iter(range(3))
print(next(it, 10))
print(next(it, 10))
print(next(it, 10))
print(next(it, 10))
print(next(it, 10))
결과
0
1
2
3
10
10