前回までのコード
def enumerate_prime_number_under(n):
return [2, 3, 5, 7]
from tdd_prime.prime_enumerator import enumerate_prime_number_under
def test_prime_enumeration():
assert enumerate_prime_number_under(10) == [2, 3, 5, 7]
素数判定の実装
今回は、前回再定義した仕様:
- 素数であるかどうかを判定
- n以下でそのように判定されたものを列挙する
に基づいて、本実装を行います。まずは、「素数であるかどうかを判定」について考えます。素数判定を行うとき、以下のようなテストケースを用いることとします:
- 7: 素数
- 14: 素数ではない
以下のテストコードを追加します:
def test_prime_judge_true():
assert is_prime_number(7) == True
def test_prime_judge_false():
assert is_prime_number(14) == False
この状態でテストを実行すると、is_prime_numberが実装されていないのでエラーが出ます。そこで、次の関数を実装しましょう:
def is_prime_number(n):
pass
すると、コンパイルエラーは出ませんが、テストが失敗することがわかります。ここから、素数判定のロジックを実装します。素数判定のアルゴリズムは色々ありますが、今回は与えられる数字の範囲が1000未満を仮定しているため、愚直な全探索による実装を選択しました:
def is_prime_number(n):
for m in range(2, n):
if n % m == 0:
return False
return True
テストコードを実行すると、テストに成功していることがわかります。これで、素数判定の機能実装が完了しました。
素数列挙の実装
いよいよ、素数列挙の実装をしましょう:
def enumerate_prime_number_under(n):
prime_numbers = []
for m in range(2, n):
if is_prime_number(m) == True:
prime_numbers.append(m)
return prime_numbers
再度テストコードを実行すると、テストに成功した状態が保たれていることがわかりますので、これで機能自体の実装は完了したことになります。残すところは、リファクタリングです。
今回のまとめと次回以降について
- 今回は素数列挙の機能を実装し、動くコードの実装が完了しました
- 次回は、動く状態を保ったままリファクタリングにより可読性の高いコードを書くことを目指します