이터레이터

yo·2020년 5월 14일
0

-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 함수 활용

-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
profile
Never stop asking why

0개의 댓글