Python

pythonによるTDD実践(5):素数列挙機能をTDDで作ってみようその3

前回までのコード

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

再度テストコードを実行すると、テストに成功した状態が保たれていることがわかりますので、これで機能自体の実装は完了したことになります。残すところは、リファクタリングです。

今回のまとめと次回以降について

  • 今回は素数列挙の機能を実装し、動くコードの実装が完了しました
  • 次回は、動く状態を保ったままリファクタリングにより可読性の高いコードを書くことを目指します
D.S S.O
データサイエンティストのS.Oです。