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