전통적인 반복자 패턴은 모두 데이터 구조체를 뒤져서 항목들을 나열하기 위한 것이지만 수열에서 다음 항목을 가져우는 메서드에 기반한 표준 인터페이스는 컬렉션에서 항목을 가져오는 대신 실행 도중에 항목을 생성하는 경우에도 유용하게 사용할 수 있다.
내장함수 range()는 정수로 구성된 유한 등차수열을 생성하며 itertools.count() 함수는 무한 등차수열을 생성한다.
#ArithmeticProgression 사용 예
ap = ArithmeticProgression(0,1,3)
list(ap)
ap = ArithmeticProgression(1, ,5,3)
list(ap)
ap = ArithmeticProgression(0,1/3,1)
list(ap)
from fractions import Fraction
ap = ArithmeticProgression(0,Fraction(1,3),1)
list(ap)
from decimal import Decimal
ap = ArithmeticProgression(0,Decimal('.1')m.3)
list(ap)
등차수열로 생성된 숫자들의 자료형이 파이썬 산술의 수치형 강제 변환 규칙에 의해 begin이나 step의 자료형을 따름에 주의하자
class ArithmeticProgression:
def __init__(self, begin,step,end=None):
self.begin = begin
self.step = step
self.end = end #None이면 무한 수열이다.
def __iter__(self):
result = type(self.begin + self.step)(self.begin)
forever = self.end is None
index =0
while forever or result < self.end:
yield result
index +=1
result = self.begin+self.step * index
iter()를 구현함으로써 제너레이터를 생성하는 것이었다면, 클래스는 단지 하나의 제너레이터 함수로 만들 수도 있을 것이었다. 왜냐하면, 제너레이터 함수도 일종의 제너레이터 팩토리이기 때문이다.
def aritprog_gen(begin, step, end=None):
result = type(begin+step)(begin)
forever = end is None
index = 0
while forever or result < end:
yield result
index +=1
result = begin+step * index