파이썬은 리스트 내의 객체나 파일의 각 로우 같은 순차적인 자료를 순회하는 일관적인 방법을 제공한다. 이터레이터 프로토콜을 이용해 순회 가능한 객체를 만들 수 있다. 예를 들어 사전을 순회하면 사전의 키가 반환된다.
for key in some_dict라고 작성하면 파이썬 인터프리터는 some_dict에서 이터레이터를 생성한다.
이터레이터는 for문 같은 컨텍스트에서 사용될 경우 객체를 반환한다. 리스트나 리스트와 유사한 객체를 취하는 대부분의 메서드는 순회 가능한 객체도 허용한다. 여기에는 min, max, sum 같은 내장 메서드와 list, tuple 같은 자료구조를 생성하는 메서드도 포함된다.
위의 그림과 같이 함수를 생성한 후 제너레이터를 호출하더라도 코드가 즉각적으로 실행되지 않는다.
제너레이터로부터 값을 요청하면 그때서야 제너레이터의 코드가 실행된다.
제너레이터 표현식
제너레이터를 생성하는 더 간단한 방법은 제너레이터 표현식을 사용하는 것이다. 다음은 리스트, 사전, 집합 표현식과 유사한 방식으로 제너레이터를 생성한다. 리스트 표현식에서 대괄호를 사용하듯이 괄호를 사용해서 제너레이터를 생성할 수 있다.
제너레이터 표현식은 리스트 표현식을 인자로 받는 어떤 파이썬 함수에서도 사용할 수 있다.
itertools 모듈
표준 라이브러리인 itertools 모듈은 일반 데이터 알고리즘을 위한 많은 제너레이터를 포함하고 있다. 예를 들어 groupby는 순차 자료구조와 함수를 받아 인자로 받은 함수에서 반환하는 값에 따라 그룹을 지어준다.
마지막으로 유용하다고 생각하는 itertools 함수를 정리해두었다. 더 많은 자료를 원한다면 공식 파이썬 문서에 나와있다.
함수 | 설명 |
combination (iterable, k) | iterable에서 순서를 고려하지 않고 길이가 k인 모든 가능한 조합을 생성 |
permutations (iterable, k) | iterable에서 순서를 고려하여 길이가 k인 모든 가능한 조합을 생성 |
groupby (iterable[, keyfunc]) | iterable에서 각각의 고유한 키에 따라 그룹을 생성 |
product(*iterables, repeat=1) | iterable에서 카테시안 곱을 구한다. 중첩된 for문 사용과 유사 |