• 파이썬 이터레이터

    2021. 7. 9.

    by. Jacob Lee

    728x90

     


     

    반복 가능한 객체 (Iterable)

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

     

    반복 가능한 객체인지 확인하기

    객체가 반복 가능한 객체인지 알아보려면 객체에 __iter__ 메서드가 들어있는지 확인해보면 된다.
    dir 함수를 사용해서 객체의 모든 메소드를 확인할 수 있다. (dir: 해당 객체에 유효한 속성들의 리스트를 돌려주려고 시도하는 내장 함수이다.)

    >>> dir([1, 2, 3])
    ['__add__', '__class__', '__class_getitem__', ...**'__iter__'** ... ]

     

    리스트뿐만 아니라, 문자열, 딕셔너리, 세트도, __iter__ 를 호출하면 이터레이터가 나온다. 그리고 이터레이터에서 __next__를 호출하면 차례대로 값을 꺼낸다.

    >>> 'Hello, world!'.__iter__()
    <str_iterator object at 0x03616770>
    >>> {'a': 1, 'b': 2}.__iter__()
    <dict_keyiterator object at 0x03870B10>
    >>> {1, 2, 3}.__iter__()
    <set_iterator object at 0x03878418>

     

    이터레이터 작동 방식

    for 문은 컨테이너 객체에 대해 iter()를 호출한다. 이 함수는 메서드 __next__ 를 정의하는 이터레이터 객체를 돌려주는데, 이 메서드는 컨테이너의 요소들을 한 번에 하나씩 접근한다.

     

    남은 요소가 없으면, __next__StopIteration 예외를 일으켜서 for 루프에 종료를 알린다. next() 내장 함수를 사용해서 __next__ 메서드를 호출할 수 있다.

    >>> s = 'abc'
    >>> it = iter(s)
    >>> it
    <iterator object at 0x00A1DB50>
    >>> next(it)
    'a'
    >>> next(it)
    'b'
    >>> next(it)
    'c'
    >>> next(it)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
        next(it)
    StopIteration

     

    이처럼 반복가능한 객체는 __iter__ 메서드로 이터레이터를 얻고, 이터레이터의 __next__ 메서드로 반복한다.

    즉, 반복 가능한 객체는 요소를 한 번에 하나씩 가져올 수 있는 객체이고, 이터레이터는 __next__ 메서드를 사용해서 차례대로 값을 꺼낼 수 있는 객체이다.

    반복 가능한 객체(iterable)와 이터레이터(Iterator)는 별개의 객체이므로 둘은 구분해야 한다. 즉, 반복 가능한 객체에서 __iter__ 메서드로 이터레이터를 얻는다.

     

    지연 평가

    연속된 숫자를 미리 만들면 숫자가 적을 때는 상관이 없지만, 숫자가 많을 때는 메모리를 많이 사용하게 되므로 성능에도 불리하다. 그래서 파이썬에서는 이터레이터만 생성하고 값이 필요한 시점이 되었을 때 값을 만드는 방식을 사용한다.

     

    즉, 데이터 생성을 뒤로 미루는 것인데 이런 방식을 지연 평가(lazy evaluation)이라고 한다.

     

    Reference

     

    728x90

    'Back-end > Python' 카테고리의 다른 글

    파이썬으로 csv 파일 읽기  (0) 2021.06.26
    파이썬 변수의 범위  (1) 2021.05.22

    댓글