break と continue

break と continue

breakキーワード

 breakキーワードは ループ を途中で終了させます
 以下のサンプルコードは whileループ の中で break を使った例です。

x = 0

while x < 10:
    x += 1
    if x == 5:
        break
    print(x, " ", end ="")
1 2 3 4

 x の値を 1 ずつ増加させて表示させるプログラムです。
 while文 の条件式は「 x が 10 未満の間は続ける」となっていますが、「 x が 5 になったら break する」という if文があるためにループが途中で打ち切られて、数字は「 4 」までしか表示されません。
 

continueキーワード

 continueキーワード はループの途中でコードの読み込みを止めて、ループ開始位置まで戻り、再び反復処理を始めます。先ほどのサンプルコードで break を continue に置き換えてみると動作の仕組みがよくわかります。

x = 0

while x < 10:
    x += 1
    if x == 5:
        continue
    print(x, " ", end ="")
1 2 3 4 6 7 8 9 10

 x の値が「 5 」に達すると、if文 の中の continueキーワードによってコードの読み込みが中断され、ループ開始位置まで戻ります。そして次の行で x に 1 が加えられて「 6 」になるので、今度は if文の条件式をスルーして先に進めます。結果として、x が「 5 」のときだけ表示されないことになります。
 

素数判定プログラム

 ループ処理や条件分枝、breakキーワードを駆使して素数判定プログラムを書いてみます。素数は 1 と自身以外に約数をもたない数と定義されているので、N を

  2, 3, 4, ...... N-1

の順に割って、どの数でも割り切れなければ、N は素数であることになります。これが最も素朴な手法なのですが、初等整数論の定理によって、除数(割る数)の上限値は √N の整数部分でよいことがわかっています(これによって計算回数を大幅に節減することができます)。たとえば N = 24 であれば、

  √24 = 4.8989794 ......

なので、除数の上限値は 4 となります。しかし、下のサンプルコードでは除数 k のとりうる範囲を 1 つだけ多くして 2 ~ ct + 1 としてあります。すなわち Range関数 の引数は (2, ct + 2) となります。1 は素数ではないので、1 が入力された場合は if文の条件式で除外する必要があります。しかし、ct の値は √1 = 1 なので、range関数の引数が (2, 2) となってしまいます。これでは rangeオブジェクトの要素数が 0 となってループ処理には使えません。1 が入力された場合の処理を別の行に書いてもいいのですが、そうするとコードの行数が増えてしまうので、1行の if文にまとめておきました。

# 素数判定プログラム

# sysモジュールをインポート
import sys

my_msg = "正の整数を入力してください:"

# ユーザーが値を入力
x = input(my_msg)

# x を整数型に変換
x = int(x)

# x が正の値でなければプログラムを終了
if x <= 0:
    print(my_msg)
    sys.exit()

# 除算の上限値を設定
ct = int(x**0.5)

for k in range(2, ct + 2):
  # x が 1 または k で割り切れる場合
    if x == 1 or x % k == 0:
        print(x, "は素数ではありません。")
        break
else:
    print("{}は素数です".format(x))
正の整数を入力してください:19
19は素数です

 コードを実行すると数字の入力が促されるので、適当な値を入力してください。
 たとえば 19 を入れると「 19 は素数です」と返ってきます。

 コードの 1 行目で sys モジュールをインポートしてありますが、これはユーザーが負の値や 0 を入力したときに、sys.exit() によってプログラムを終了させるためです。

 この else は if ではなく、for と組み合わされています(インデントを間違えているわけではありません)。Python では else文を while文や for文と組合わせることもできるのです。for(または while)と break のあとに else を記述すると、ループの中で1度も break されなかったときだけ else文のコードブロックが実行されます。サンプルでは、ループ処理のところで入力された数字を 2, 3, 4, ...... で割っていき、一度も割り切れなかった場合のみ break をスルーして、その下の else文によって「素数です」と表示されます。