티스토리 뷰

프로그래밍 언어에서 이터레이터는 미리 정해진 값의 집합에 대해 값을 하나씩 돌려주는 기능(하나씩 끝까지 반복하게 해주는 기능)을 제공하는 객체입니다. 언어마다 이터레이터를 사용하는 방식이 다른데 파이썬은 이터레이터를 언어의 중요한 개념으로 사용하고 있습니다.

순차나열의 구조를 가지는 반복부를 분석해보면 (1) 반복되는 대상 집합과 (2) 반복을 위해 값을 하나씩 꺼내서 주는 부분(다음 값이 무엇인지, 언제 끝낼지 결정해야 함), 그리고 (3) 그것을 이용해서 뭔가를 처리하는 코드 부분으로 구성되어 있습니다. 이 때 값을 하나씩 제공하는 부분과 그 값을 사용하는 부분이 분리되게 코드를 구성한다면 가독성을 올리고 재사용성이 훨씬 높아지는 코드를 작성할 수 있습니다.

이터레이터는 다음 값을 제공하는 기능과 끝인지를 검사하는 기능을 가지는 객체입니다. 파이썬에서는 이터레이터에 대한 참조 it가 있다면 next(it)는 다음 값을 돌려받게 되고 다음 값이 없을 때는 StopIteration이라는 예외를 일으키게 됩니다.

이터레이터를 사용하는 가장 대표적인 예는 파이썬의 for 루프입니다. 사실 쉽게 생각해서 for 루프를 돌릴 수 있으면 이터레이터가 됩니다. for 루프는 next()를 통해 다음 요소를 받고 StopIteration이 발생하면 종료하는 반복 기능입니다. 여기서 for x in A: 의 A 부분에 등장하는 것은 모두 이터레이터의 기능을 제공할 수 있습니다. 여기에 등장하는 대표적인 것이 range(n)입니다. 이것은 0부터 n까지의 수열을 차례로 돌려주는 이터레이터입니다. 뒤에서 살펴보겠지만 이것은 이터레이터의 기능을 제공할 수 있는 빌트인 제너레이터 함수의 일종입니다.

for 루프에 많이 등장하는 것으로 순차적인 자료구조를 가지는 sequence 타입이 있습니다. 파이썬에서 sequence란 순차적인 자료구조를 가지는 클래스들을 통칭하는 개념으로 리스트, 스트링, 파일 등을 포함합니다. 이런 클래스 객체가 for x in ...의 ... 부분에 등장하면 그 객체의 이터레이터를 이용해 반복하는 구조가 됩니다.

mylist = [1, 2, 3, 4, 5]
for x in mylist:
    print(x)

위와 같은 for 루프는 사실은 다음 코드와 같이 동작합니다. 

mylist = [1, 2, 3, 4, 5]
it = iter(mylist)
while True:
    try:
        x = next(it)
    except StopIteration:
        break;
    print(x)

여기서 iter 함수는 리스트 mylist의 이터레이터를 돌려주는 함수입니다. 위에서 얘기했던 for 루프의 자리에 올 수 있는 것은 사실 이터레이터를 돌려줄 수 있는 모든 객체, 즉 이터러블이 됩니다. 리스트나 range() 함수는 모두 이터러블입니다.

이 외에도 제너레이터가 이터러블의 대표적인 예입니다. 제터레이터는 라이브러리 함수 중에도 많이 있고 프로그램에서 만들 수도 있습니다. 제너레이터 수식 글에서 제너레이터 수식을 만드는 방법을 살펴봅니다.

그럼 이제 이터러블과 이터레이터, 제너레이터의 관계를 살펴보겠습니다. 

이 그림에서 화살표는 속성을 물려받는 일종의 상속이라고 생각하시면 됩니다.

  • 이터러블: 이터러블은 이터레이터를 만들어 낼 수 있는 성질입니다. 즉 iter() 함수를 통해 이터레이터를 제공할 수 있는 객체인 것이죠. 파이썬의 가장 대표적인 인터페이스 중 하나입니다.  
  • 이터레이터는 반복을 하게 해주는 인터페이스입니다. next()에 넣어서 호출할 수 있고 StopIteration을 발생시킬 수 있는 객체를 의미합니다. 이터레이터는 한번의 반복만을 해주는 역할을 합니다. (끝을 판별할 수 있어야 함)

 

그럼 for 루프는 기본적으로 이터레이터를 이용하지만, syntactic sugar로 이터러블이 오면 iter()를 불러 이터레이터를 받는 것까지도 알아서 해줍니다.

그럼 제너레이터는 무엇일까요? zip()이나 enumerate() 같은 함수가 제너레이터 함수입니다. 제너레이터 수식은 컴프리헨션처럼 생긴 수식으로 제터레이터를 생성할 수 있게 해 줍니다. 이것이 파이썬의 핵심이라고 할 수 있습니다. 

이터레이터와 이터러블 관련 동영상 강의도 참고 바랍니다.

참고자료

[1] iterables vs. iterators vs. generators, by Vincent Driessen.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함