11.4.2例素数を求めるイテレーター
>>> import math
>>>
>>> class Prime:
... def __init__(self, max):
... self.max = max
... self.__current = 1
... #イテレーター(自分自身を返す)
... def __iter__(self):
... return self
... #イテレーターの本体を実装
... def __next__(self):
... while True:
... self.__current += 1
... if self.__current > self.max:
... raise StopIteration
... elif self.__is_prime(self.__current):
... return self.__current
...
... #引数valueが素数かどうかを判定
... def __is_prime(self, value):
... result = True #素数かどうかを判定
... #2~sqrt(value)で、valueを割り切る(=余りが0)ものがあるか
... for i in range(2, math.floor(math.sqrt(value)) + 1):
... if value % i == 0:
... result = False #割り切れるものがあれば素数でない
... break
... return result
...
>>> if __name__ == '__main__':
... pr = Prime(100)
... for p in pr:
... print(p)
...
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
>>>
1.ライブラリのインポート:
mathモジュールをインポートしています。これは後で平方根を求めるために使用します。
クラスの定義:
2.Prime- このクラスは、指定された上限までの素数を順番に返すイテレータとして機能します。
メソッド:
3.__init__- インスタンスを初期化します。
maxは返す最大の数値を指定します。__currentは現在の数字を保存し、1からスタートします。
- インスタンスを初期化します。
メソッド:
4.__iter__- イテレータとしてこのクラスを使用するための必要なメソッドです。自分自身を返すことで、
forループで使えるようにしています。
- イテレータとしてこのクラスを使用するための必要なメソッドです。自分自身を返すことで、
メソッド:
5.__next__- このメソッドは、次の素数を返す役割があります。
__currentをインクリメントします。__currentがmaxを超えていれば、StopIterationを発生させてイテレーションを終了します。__currentが素数であるかの判定を行い、素数であればその値を返します。
- このメソッドは、次の素数を返す役割があります。
メソッド:
6.__is_prime- 引数として与えられた数字が素数であるかどうかを判定します。
- 2 から引数の平方根までの範囲で、引数を割り切れる数字があるかどうかをチェックします。割り切れる数字があれば、その数字は素数ではないと判断します。
7.メインの実行部分:- クラスを100という上限でインスタンス化し、そのインスタンスを用いて100以下のすべての素数を表示します。
コメント