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. 1.ライブラリのインポート:

    • math モジュールをインポートしています。これは後で平方根を求めるために使用します。

  2. 2.Prime
    クラスの定義
    :

    • このクラスは、指定された上限までの素数を順番に返すイテレータとして機能します。

  3. 3.__init__
    メソッド
    :

    • インスタンスを初期化します。max は返す最大の数値を指定します。__current は現在の数字を保存し、1からスタートします。

  4. 4.__iter__
    メソッド
    :

    • イテレータとしてこのクラスを使用するための必要なメソッドです。自分自身を返すことで、for ループで使えるようにしています。

  5. 5.__next__
    メソッド
    :

    • このメソッドは、次の素数を返す役割があります。
      1. __current をインクリメントします。
      2. __currentmax を超えていれば、StopIteration を発生させてイテレーションを終了します。
      3. __current が素数であるかの判定を行い、素数であればその値を返します。

  6. 6.__is_prime
    メソッド
    :

    • 引数として与えられた数字が素数であるかどうかを判定します。
    • 2 から引数の平方根までの範囲で、引数を割り切れる数字があるかどうかをチェックします。割り切れる数字があれば、その数字は素数ではないと判断します。

  7. 7.メインの実行部分
    :

    • クラスを100という上限でインスタンス化し、そのインスタンスを用いて100以下のすべての素数を表示します。