ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 - 이터레이터
    python 2021. 3. 18. 21:55
    이터레이터(Iterator)는 값을 차례대로 꺼낼 수 있는 객체다. 파이썬에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용한다. 이 행위는 데이터 생성을 뒤로 미루는 것인데 이런 방식을 지연 평가(lazy evaluation)이라고 한다. 이터레이터는 반복자라고 부르기도 한다.                           출처: 코딩도장

     

    요소가 여러 개 들어있고, 한 번에 하나씩 꺼낼 수 있는 객체를 반복 가능한 객체라고 한다. 흔히 사용하는 문자열, 리스트,딕셔너리 등이 반복 가능한 객체다.

     

    객체가 반복 가능한지 알기 위해선 객체에 __iter__ 메서드가 있는지 확인해보면 된다.

    >>> 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']
    
    >>> [1,2,3].__iter__()
    <list_iterator object at 0x000001FC4F0428E0>

     

     

     

    리스트의 이터레이터를 변수에 저장한뒤 __next__메서드를 호출해서 요소를 차례대로 꺼낼 수 있다. 모두 꺼낸 이후 더 이상 꺼낼 요소가 없으면 Stopiteration 예외를 발생시켜서 반복을 끝낸다.

    >>> it = [1,2,3].__iter__()
    >>> it.__next__()
    1
    >>> it.__next__()
    2
    >>> it.__next__()
    3
    >>> it.__next__()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    >>> it = range(3).__iter__()
    >>> it.__next__()
    0
    >>> it.__next__()
    1
    >>> it.__next__()
    2
    >>> it.__next__()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration

     

     


    반복 가능한 객체는 __iter__ 메서드로 이터레이터를 얻고, 이터레이터의 __next__ 메서드로 반복한다. 여기서는 반복 가능한 객체와 이터레이터가 분리되어 있지만 클래스에 __iter__와 __next__ 메서드를 모두 구현하면 이터레이터를 만들 수 있다. 특히 __iter__, __next__를 가진 객체를 이터레이터 프로토콜(iterator protocol)을 지원한다고 말한다.

     

    정리하자면 반복 가능한 객체는 요소를 한 번에 하나씩 가져올 수 있는 객체이고, 이터레이터는 __next__ 메서드를 사용해서 차례대로 값을 꺼낼 수 있는 객체다. 반복 가능한 객체(iterable)와 이터레이터(iterator)는 별개의 객체이므로 둘은 구분해야 한다. 즉, 반복 가능한 객체에서 __iter__ 메서드로 이터레이터를 얻는다.


    반복 가능한 객체는 시퀀스 객체를 포함한다

     


    이터레이터 만들기

     

    __iter__, __next__ 메서드를 구현해서 직접 이터레이터를 만들 수 있다.

    class 이터레이터이름:
        def __iter__(self):
            코드
        def __next__(self):
            코드

     

    class Counter:
        def __init__(self, stop):
            self.current = 0    # 현재 숫자 유지, 0부터 지정된 숫자 직전까지 반복
            self.stop = stop    # 반복을 끝낼 숫자
     
        def __iter__(self):
            return self         # 현재 인스턴스를 반환
     
        def __next__(self):
            if self.current < self.stop:    # 현재 숫자가 반복을 끝낼 숫자보다 작을 때
                r = self.current            # 반환할 숫자를 변수에 저장
                self.current += 1           # 현재 숫자를 1 증가시킴
                return r                    # 숫자를 반환
            else:                           # 현재 숫자가 반복을 끝낼 숫자보다 크거나 같을 때
                raise StopIteration         # 예외 발생
     
    for i in Counter(3):
        print(i, end=' ')
    #실행 결과
    012

     

     

     

    'python' 카테고리의 다른 글

    파이썬 - 제너레이터 / 데커레이터  (0) 2021.03.19
    파이썬 - docstring  (0) 2021.03.19
    파이썬 - 람다 함수  (0) 2021.03.16
    파이썬 - 인수(argument)  (0) 2021.03.16
    클래스 - 메서드 오버라이딩과 다형성  (0) 2021.03.11
Designed by Tistory.