Python | continue文とbreak文

こんにちは。最近はPythonを学習しています。

今回はPythonのcontinue文とbreak文を使ってみました。これらはfor文やwhile文のブロック(繰り返し処理)で使用することができます。continue文とbreak文それぞれについて、サンプルプログラムを作って、動作を確認してみました。この記事は、その時に学んだことの備忘録です。

サンプルプログラムでは、for文とif文を使っていますが、それについては「Python | for文とwhile文を学習した」と「Python | if文(if, elif, else)を学習した」に備忘録を載せてます。

continue文

continue文はfor文やwhile文のブロックで記述することができます。continue文が実行されると処理は次のループへ遷移します。

以下のサンプルプログラムはcontinue文の動作を確認するための簡単なプログラムです。

ソース
scores = [50, 52, 81, 69, 38]

for score in scores:
    print('-----------------------------')
    print('Point...{0}'.format(score))

    if score >= 80:
        continue

    print('頑張ろう')

実行結果は以下です。

結果
-----------------------------
Point...50
頑張ろう
-----------------------------
Point...52
頑張ろう
-----------------------------
Point...81
-----------------------------
Point...69
頑張ろう
-----------------------------
Point...38
頑張ろう

上記はscoresにlist型を格納しています。このlist型に点数の一覧が格納されているという想定です。for文で繰り返しの変数scoreに点数が格納されます。繰り返し処理では点数が80未満の場合に、メッセージを出力しています。

変数scoreの値が81の場合、continue文が実行されます。処理は次のループへ移ります。そのため、continue文より下に記述されているprint文は実行されません。

以下は参考までに、print文が実行されたのかを示す表です。

scoreの値 50 52 81 69 38
1つ目の
print文
2つ目の
print文
3つ目の
print文

なお、上記のサンプルプログラムはcontinue文を使わない書き方もできます。if文の条件を反転させて、if文のブロックに直接print文を書けば、同様の処理になります。

continue文を使わない例
scores = [50, 52, 81, 69, 38]

for score in scores:
    print('-----------------------------')
    print('Point...{0}'.format(score))

    if score < 80:
        print('頑張ろう')

ただし、print文のインデントが1段深くなります。

for文の繰り返し処理全体をif文で囲んでいる場合は、最初にcontinue文を使うと見通しが良くなるかもしれません。

以下はfor文の繰り返し処理が2行の場合です。

ソース
scores = [50, 52, None, 69, 38]

# continueを使わない場合
for score in scores:
    if score is not None:
        print('Point')
        print(' ...{0}'.format(score))

print('----------------------------------------')

# continue文を使う場合
for score in scores:
    if score is None:
        continue

    print('Point')
    print(' ...{0}'.format(score))

実行結果は以下です。

結果
Point
 ...50
Point
 ...52
Point
 ...69
Point
 ...38
----------------------------------------
Point
 ...50
Point
 ...52
Point
 ...69
Point
 ...38

上記は変数scoreの値がNoneの場合は処理をしないという想定です。2番目のfor文ではprint文のインデントが1段少なくなっています。

break文

for文でbreak文が実行されると処理がループから抜けます。例えば、目的の値を見つけるだけの繰り返し処理の場合、後続の無駄な繰り返し処理を実行しなくて済みます。

以下のサンプルプログラムではlist型変数scoresの中に点数が80以上が存在するか調べるプログラムです。

ソース
scores = [50, 52, 81, 69, 38]

score_first_passed = None
for score in scores:
    print('Point...{0}'.format(score))

    if score >= 80:
        score_first_passed = score
        break

    print('この点数は不合格です。')

print('-----------------------------------')

if score_first_passed is not None:
    print('最初の合格者の点数は{0}点です。'.format(score_first_passed))
else:
    print('合格者はいませんでした。')

変数scoreの値が80以上の場合、その値を変数score_first_passedに格納しています。その後、break文が実行され、繰り返し処理はそこで終わります。

実行結果は以下です。

結果
Point...50
この点数は不合格です。
Point...52
この点数は不合格です。
Point...81
-----------------------------------
最初の合格者の点数は81点です。

for文のブロックの最初のprint文が3回目までしか出力されていないのは、break文が実行されたからです。また、break文の下に記述してあるprint文は実行されません。

以下は参考までに、print文が実行されたのかを示す表です。

scoreの値 50 52 81 69 38
1つ目の
print文
2つ目の
print文

break文が実行されると処理がループを抜けるため、点数81の処理では2つ目のprint文は実行されません。点数69と38に対する処理も実行されません。

2重ループの場合

continue文は最も内側のループをスキップし、break文は最も内側のループを抜けます。

以下は上記を確認するだけのサンプルプログラムです。

ソース
my_range = range(1, 6);

for i in my_range:
    for j in my_range:
        print('{0:>3}'.format(i * j), end='')

    print()

print('-----------------------------------')

for i in my_range:
    for j in my_range:
        if i == 3 and j == 3:
            continue

        print('{0:>3}'.format(i * j), end='')

    print()

print('-----------------------------------')

for i in my_range:
    for j in my_range:
        if i == 3 and j == 3:
            break

        print('{0:>3}'.format(i * j), end='')

    print()

上記のfor文では、変数iと変数jに1から5が格納されます。最初のfor文は掛け算の表を出力しています。2番目のfor文では変数iの値がが3かつ変数jの値が3のときに、continue文を実行しています。3番目のfor文では同様の条件で、break文を実行しています。

出力結果は以下の通りです。

結果
  1  2  3  4  5
  2  4  6  8 10
  3  6  9 12 15
  4  8 12 16 20
  5 10 15 20 25
-----------------------------------
  1  2  3  4  5
  2  4  6  8 10
  3  6 12 15
  4  8 12 16 20
  5 10 15 20 25
-----------------------------------
  1  2  3  4  5
  2  4  6  8 10
  3  6
  4  8 12 16 20
  5 10 15 20 25

2番目のfor文では3段目の出力のループでcontinue文が実行されるため、値9が出力されてません。内側のループをスキップしているので、値12と値15は出力されています。

3番目のfor文では3段目の出力のループでbreak文が実行されるため、値6までしか出力されてません。これは内側のループを抜けたからです。

以上、参考になれば幸いです。

同じカテゴリーの前後の記事