또 다른 예제: 등차수열 제너레이터

매일 공부(ML)·2023년 4월 12일
0

Fluent Python

목록 보기
104/130

제어 흐름

반복형,반복자, 제너레이터

또 다른 예제: 등차수열 제너레이터

전통적인 반복자 패턴은 모두 데이터 구조체를 뒤져서 항목들을 나열하기 위한 것이지만 수열에서 다음 항목을 가져우는 메서드에 기반한 표준 인터페이스는 컬렉션에서 항목을 가져오는 대신 실행 도중에 항목을 생성하는 경우에도 유용하게 사용할 수 있다.

내장함수 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
profile
성장을 도울 아카이빙 블로그

0개의 댓글