39.6 연습문제: 배수 이터레이터 만들기

다음 소스 코드에서 특정 수의 배수를 만드는 이터레이터를 작성하세요. 배수는 0부터 지정된 숫자보다 작을 때까지 만들어야 합니다.

practice_iterator.py

class MultipleIterator:
    def __init__(self, stop, multiple):
                               
        ...
                                 
 
    def __iter__(self):
        return self
 
    def __next__(self):
                                                   
        ...
                                                     
 
for i in MultipleIterator(20, 3):
    print(i, end=' ')
 
print()
for i in MultipleIterator(30, 5):
    print(i, end=' ')

실행 결과

3 6 9 12 15 18 
5 10 15 20 25 

정답

 self.stop = stop
   self.multiple = multiple
   self.current = 0
 self.current += 1
   if self.current * self.multiple < self.stop:
       return self.current * self.multiple
   else:
       raise StopIteration

해설

이터레이터 MultipleIterator에는 MultipleIterator(20, 3)과 같이 반복을 끝낼 숫자 stop과 배수를 구할 숫자 multiple을 넣었습니다. 먼저 __init__ 메서드에서 self.stopstop을 저장하고, self.multiplemultiple을 저장합니다. 그리고 몇 번 반복했는지를 저장해야 하므로 self.current를 만들고 0을 저장합니다.

이제 __next__ 메서드에서 배수를 구합니다. 배수는 self.currentself.multiple의 곱을 구하면 됩니다. 단, self.current가 0부터 시작했으므로 0에 self.multiple을 곱하면 0입니다. 따라서 self.current를 1 증가시켜서 1부터 곱하도록 만듭니다. 그리고 반복을 끝낼 조건을 만들어야 하는데, 배수가 반복을 끝낼 숫자 self.stop보다 작은지 판단하면 됩니다. 따라서 if self.current * self.multiple < self.stop:과 같이 조건문을 만들어주고 참이면 배수를 반환하고 거짓이면 StopIteration 예외를 발생시키면 됩니다.