
Table of Contents(目次)
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が実行される場合
for
にelse
を組み合わせると、ループが途中で繰り返し処理を抜けずに最後まで動いたときだけ、else
の中身が実行されます。
注意: 次のコードには、for
に対応する else
と、if
に対応する else
の両方が含まれています。このような場合、インデントの深さによって、どの else
がどの構文に対応しているかを判別します。つまり、9行目の else
は if
に対応し、12行目の else
は for
に対応しています。
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
は「最後まで動いたときに実行する」。どの構文も条件に合わなければ実行されず、ループは通常どおり進みます。