본문 바로가기
Python Basic

이터레이터(iterator)

by fiasco 2022. 11. 23.

이터레이터(iterator)는 값을 차례대로 꺼낼 수 있는 객체(object)입니다.

 

반복 가능한 객체(iterable)는 말 그대로 반복할 수 있는 객체인데 우리가 흔히 사용하는 문자열, 리스트, 딕셔너리, 세트가 반복 가능한 객체입니다. 즉, 요소가 여러 개 들어있고, 한 번에 하나씩 꺼낼 수 있는 객체입니다.

dir 함수를 사용하여 __iter__ 메서드가 들어있으면 iterable객체이다.

L=[1,2,3]
it = L.__iter__()             # == iter(L)

for i in range(len(L)):
    result = it.__next__()     # == next(it)
    print(result)

 

이더레이터 만들기

__init__ 메서드와 __getitem__ 메서드만 있는데도 동작이 잘 됩니다.

__iter__, __next__는 생략해도 됩니다(초깃값이 없다면 __init__도 생략 가능).

class 이터레이터이름:
    def __iter__(self):
        코드
 
    def __next__(self):
        코드
        
    def __getitem__(self, 인덱스):
        코드

 

class Counter(list):
    def __init__(self, stop):
        super().__init__()
        self.current = 0  # 현재 숫자 유지, 0부터 지정된 숫자 직전까지 반복
        self.stop = stop  # 반복을 끝낼 숫자

    def __iter__(self):
        return self  # 현재 인스턴스를 반환

    def __next__(self):
        if self.current < self.stop:  # 현재 숫자가 반복을 끝낼 숫자보다 작을 때
            r = self.current*10  # 반환할 숫자를 변수에 저장
            self.current += 1  # 현재 숫자를 1 증가시킴
            return r  # 숫자를 반환
        else:  # 현재 숫자가 반복을 끝낼 숫자보다 크거나 같을 때
            raise StopIteration  # 예외 발생

    def __getitem__(self, index):
        if index < self.stop:
            return index*10
        else:
            raise IndexError

for i in Counter(3):
    print(i, end=' ')

print()
co = Counter(3)
for j in range(3):
    print(co[j], end=' ')

 

이더레이터 활용

이더레이터 생성 : iter(iterable객체, [반복을 끝낼값])

import random

it = iter(lambda :random.randint(0,5),2)
for i in it:
    print(i,end=' ')

 

next 사용 : next(iterable객체, 기본값)

                                                 기본값 : StopIteration예외 발생시 반환할 값

import random

it = iter(range(3))
for i in range(5):
    print(next(it,'fault'))

'Python Basic' 카테고리의 다른 글

제너레이터(generator)  (0) 2022.11.23
Exception  (0) 2022.11.23
decorator 사용법  (0) 2022.11.23
closure 사용법  (0) 2022.11.23
Programming productivity tools  (0) 2022.11.08