sec03 - 【Python入門】for文の制御構文(break / continue / else)をわかりやすく解説
スポンサーリンク

for文の制御構文(break / continue / else)

for文の基本的な仕組みは、これまでのレクチャーで理解できたかと思います。でも、ループの途中で「止めたい」「この回だけスキップしたい」「全部終わったあとに特別な処理をしたい」と思うことはありませんか?

Pythonには、そんなときに使える3つの便利な制御構文があります。

構文動作よく使う場面
breakループを完全に終了する条件が見つかったら繰り返しから抜けたいとき
continue現在の処理だけスキップ条件に合わない回を飛ばしたいとき
elseループが「最後まで」動いたときに実行
(breakが一度も実行されなかったとき)
検索や検証などで「該当なし」を処理したいとき

それぞれの構文がどう動くのか、実行される場合とされない場合の両方を見ながら学んでいきましょう。

1. break:ループを途中で止める

条件に当たる場合

breakは「もうこの先は必要ない」と判断したときに、ループを強制的に終了します。

例えば、社員名と社員番号のdictから、特定の社員("Nico")を探して、見つけたら処理を止めるような場合です。

employees = {
    'Liam': 101,
    'Olivia': 102,
    'Nico': 103,
    'Emma': 104,
    'Noah': 105
}

target_name = 'Nico'

for name, emp_id in employees.items():
    print(f'{name} さんを確認中...')
    if name == target_name:
        print(f'{name} さんの社員番号は {emp_id} です')
        break
print('ループ終了')

出力結果:

Liam さんを確認中...
Olivia さんを確認中...
Nico さんを確認中...
Nico さんの社員番号は 103 です
ループ終了

breakが実行された時点でループを抜けるため、"Emma"さんと"Noah"さんの確認は行われません。

条件に当たらない場合

次のコードのdictには"Sara"さんの情報は存在しないため、breakは一度も実行されません。つまり、ループは通常どおり最後まで繰り返されます。

employees = {
    'Liam': 101,
    'Olivia': 102,
    'Nico': 103,
    'Emma': 104,
    'Noah': 105
}

target_name = 'Sara'

for name, emp_id in employees.items():
    print(f'{name} さんを確認中...')
    if name == target_name:
        print(f'{name} さんの社員番号は {emp_id} です')
        break
print('ループ終了')

出力結果:

Liam さんを確認中...
Olivia さんを確認中...
Nico さんを確認中...
Emma さんを確認中...
Noah さんを確認中...
ループ終了
スポンサーリンク

2. continue:一部の処理をスキップする

条件に当たる場合

continueは「この回は処理を飛ばして、次のループに進みたい」ときに使います。

例えば、特定の社員を処理から除外したい場合、continueを使います。この例では、'Nico''Emma'さんの処理だけスキップして、他の人は通常処理します。

employees = ['Liam', 'Olivia', 'Nico', 'Emma', 'Noah']
skip_names = ['Nico', 'Emma']

for name in employees:
    print(f'{name} さんを処理開始...')
    if name in skip_names:
        print(f'→ {name} さんは対象外なのでスキップします')
        continue
    print(f'{name} さんのデータを更新')
print('全員の処理が完了しました')

出力結果:

Liam さんを処理開始...
Liam さんのデータを更新
Olivia さんを処理開始...
Olivia さんのデータを更新
Nico さんを処理開始...
→ Nico さんは対象外なのでスキップします
Emma さんを処理開始...
→ Emma さんは対象外なのでスキップします
Noah さんを処理開始...
Noah さんのデータを更新
全員の処理が完了しました

社員名が'Nico''Emma'のときにcontinueが実行され、その回のprint(f'{name} さんのデータを更新')がスキップされます。ループ自体は止まらず、次の繰り返しへ進みます。

条件に一致しない場合

次のコードの場合、どの回もcontinue条件に当たらないため、すべての回でprint(f'{name} さんのデータを更新')が実行されます。「スキップされる回がなければ、通常通り全て実行される」という点を理解しておきましょう。

employees = ['Liam', 'Olivia', 'Nico', 'Emma', 'Noah']
skip_names = ['Sara', 'Tom']

for name in employees:
    print(f'{name} さんを処理開始...')
    if name in skip_names:
        print(f'→ {name} さんは対象外なのでスキップします')
        continue
    print(f'{name} さんのデータを更新')
print('全員の処理が完了しました')

出力結果:

Liam さんを処理開始...
Liam さんのデータを更新
Olivia さんを処理開始...
Olivia さんのデータを更新
Nico さんを処理開始...
Nico さんのデータを更新
Emma さんを処理開始...
Emma さんのデータを更新
Noah さんを処理開始...
Noah さんのデータを更新
全員の処理が完了しました

3. else:最後まで実行されたときに動く

elseは、breakによって繰り返し処理が中断されなかったときに実行されるブロックです。

なお、continueが実行されても、breakによって中断されなければelseブロックは実行されます。

breakに当たらず、elseが実行される場合

forelseを組み合わせると、ループが途中で繰り返し処理を抜けずに最後まで動いたときだけ、elseの中身が実行されます。

注意: 次のコードには、for に対応する else と、if に対応する else の両方が含まれています。このような場合、インデントの深さによって、どの else がどの構文に対応しているかを判別します。つまり、9行目の elseif に対応し、12行目の elsefor に対応しています。

employees = ['Liam', 'Olivia', 'Nico', 'Emma', 'Noah']
target_names = ['Sophia', 'Mason']

for name in employees:
    print(f'{name} さんを確認...')
    if name in target_names:
        print(f'{name} さんが見つかりました')
        break
    else:
        print('スキップします')
        continue
else:
    print('検索した社員が見つかりませんでした')
print('全員の検索処理が完了しました')

出力結果:

Liam さんを確認...
スキップします
Olivia さんを確認...
スキップします
Nico さんを確認...
スキップします
Emma さんを確認...
スキップします
Noah さんを確認...
スキップします
検索した社員が見つかりませんでした
全員の検索処理が完了しました

検索した社員が見つからなかったため、breakが一度も実行されず、elseが動きます。continueが実行されてもelseは動きます。

breakに当たり、elseが実行されない場合

employees = ['Liam', 'Olivia', 'Nico', 'Emma', 'Noah']
target_names = ['Sophia', 'Nico']

for name in employees:
    print(f'{name} さんを確認...')
    if name in target_names:
        print(f'{name} さんが見つかりました')
        break
    else:
        print('スキップします')
        continue
else:
    print('検索した社員が見つかりませんでした')
print('全員の検索処理が完了しました')

出力結果:

Liam さんを確認...
スキップします
Olivia さんを確認...
スキップします
Nico さんを確認...
Nico さんが見つかりました
全員の検索処理が完了しました

今回は'Nico'さんが見つかってbreakが実行されたため、elseはスキップされます。このように、for ... elseは「ループを途中で抜けたかどうか」で動作が変わります。

まとめ

構文動作実行される条件よく使う場面
breakループを完全に終了する条件に合ったとき検索結果が見つかったときなど
continue現在の処理だけスキップ条件に合った回だけ除外条件を設定したいとき
elseループが最後まで動いたときに実行breakが一度も実行されなかったとき検索で「見つからなかった」処理など

breakは「止める」、continueは「飛ばす」、elseは「最後まで動いたときに実行する」。どの構文も条件に合わなければ実行されず、ループは通常どおり進みます。

スポンサーリンク