複数の条件を順番に判定して、適切な処理を1つだけ選びたいときに活躍するのがPythonのif-elif-else
です。
上から順に条件を評価し、最初に真になったブロックだけを実行するため、読みやすさとバグの少なさにつながります。
初心者でも迷わない書き方と、実務でよく使うパターンを丁寧に解説します。
Pythonのif-elif-else文とは
複数条件を1本の流れで判定する仕組み
1本の流れとは
if-elif-else
は複数の条件を縦に並べ、上から順番に評価して最初の一致だけを実行する構文です。
後続のelif
やelse
は、すでにどこかが実行された時点でスキップされます。
これにより、処理の選択が常に1つに定まります。
ミニサンプル
最初に真になった分岐だけが実行される様子を確認してみます。
# 上から順に評価し、最初の一致だけを実行する例
x = 7
if x < 0:
print("負の数")
elif x % 2 == 0:
print("偶数")
else:
print("奇数") # x=7 は上の2条件に当てはまらないのでここ
奇数
複数のifとの違いと使い分け
比較表
「複数のif」と「if-elif-else」は、同じ見た目でも意味が違います。
状況に応じて使い分けましょう。
書き方 | 条件が複数真のとき | 実行ブロック数 | 典型用途 |
---|---|---|---|
if-elif-else | 最初に真の1つだけ | 1 | ランク分け、閾値の段階判定、カテゴリ分類 |
複数のif | 真の分だけすべて | 複数 | 複数の独立チェック、同時に成り立つ検査 |
「必ず1つだけ選びたい」ならif-elif-else
、「条件は独立で両方実行したい」なら複数のif
が適切です。
動くサンプル
# if-elif-else は1つだけ
temp = 35
if temp >= 30:
print("暑い")
elif temp >= 20:
print("暖かい")
else:
print("涼しい")
暑い
# 複数の if は独立に評価される
temp = 35
if temp >= 30:
print("暑い")
if temp >= 20:
print("暖かい") # こちらも条件を満たすので実行される
暑い
暖かい
どんなときに使うか(初心者向けの判断基準)
カテゴリや段階が互いに重ならず、1つだけ選びたいときはif-elif-else
を選びます。
例えば、テストの点数でA/B/Cを割り振る、コマンド名に応じて処理を分岐する、などです。
逆に、入力検証のように複数のチェックを全部通したい場合はif
を複数使います。
迷ったら「1つだけ選ぶのか、複数実行したいのか」で判断すると良いです。
if-elif-else文の基本の書き方
構文のテンプレート(インデントとコロン)
まずは形を覚える
Pythonではコロン:
とインデントが構文の鍵です。
インデントは通常4スペースを使います。
# 構文テンプレート
value = 10
if 条件式1: # コロンを忘れない
# 条件式1が真のときの処理 (4スペースでインデント)
pass
elif 条件式2:
# 条件式1が偽で、条件式2が真のときの処理
pass
else:
# 上のどれにも当てはまらないときの処理
pass
よくある落とし穴
コロンの付け忘れとインデントの乱れが初心者の最頻エラーです。
エディタの自動整形を活用すると防げます。
elifとelseの配置と実行の流れ(上から順に判定)
実行の基本ルール
上から順に判定し、最初に真になった分岐だけが実行されるというルールを常に意識します。
条件が重なる可能性があるなら、より厳しい条件を先に書くのがコツです。
# 実行の流れを確認
x = 12
if x % 3 == 0:
print("3の倍数") # ここで実行され、以降はスキップ
elif x % 2 == 0:
print("2の倍数")
else:
print("それ以外")
3の倍数
条件が重ならない範囲の設計
設計の原則
範囲判定は「上限または下限で線を引き、互いに重ならないようにする」のが基本です。
Pythonでは80 <= score < 90
のような連鎖比較が読みやすく安全です。
サンプル
# 重ならない範囲の設計
score = 85
if 90 <= score <= 100:
grade = "S"
elif 80 <= score < 90:
grade = "A"
elif 70 <= score < 80:
grade = "B"
elif 60 <= score < 70:
grade = "C"
elif 0 <= score < 60:
grade = "F"
else:
grade = "無効" # 範囲外の値
print(grade)
A
初心者向けの実例で理解する
数値の範囲で分岐する(例: テストの評価)
仕様
点数(0〜100)をS/A/B/C/Fに分類し、範囲外は無効とする例です。
条件は上から厳しい順(高い点数ほど先)に並べます。
# テストの評価を割り当てる例
def grade(score: int) -> str:
# 範囲外のチェックを先に行う
if score < 0 or score > 100:
return "無効"
# 厳しい条件から順に判定
elif score >= 90:
return "S"
elif score >= 80:
return "A"
elif score >= 70:
return "B"
elif score >= 60:
return "C"
else:
return "F" # それ以外はF
# いくつかの値で動作確認
samples = [95, 82, 68, 40, -5, 120]
for s in samples:
print(f"{s}: {grade(s)}")
95: S
82: A
68: C
40: F
-5: 無効
120: 無効
文字列で分岐する(例: コマンド入力)
仕様
ユーザーのコマンド文字列に応じて処理を分ける例です。
大文字小文字や余分な空白を吸収するためにlower()
やstrip()
を使います。
# コマンドに応じて分岐する例
commands = ["start", "Stop", " help ", "status"]
for raw in commands:
cmd = raw.strip().lower() # 正規化してから判定
if cmd == "start":
print("システムを開始します")
elif cmd == "stop":
print("システムを停止します")
elif cmd == "help":
print("使い方: start/stop/help")
else:
print(f"不明なコマンド: {raw!r}")
システムを開始します
システムを停止します
使い方: start/stop/help
不明なコマンド: 'status'
デフォルトの処理はelseにまとめる
考え方
未知の入力や新しい値に対して「無難な動作」を決めておくとプログラムが堅牢になります。
その受け皿がelse
です。
必ずしもエラーにせず、既定値に落とす戦略もよく使われます。
# ログレベル名を数値に変換。未知の値は INFO(20) にフォールバック
def to_log_level(name: str) -> int:
n = name.lower()
if n == "debug":
return 10
elif n == "info":
return 20
elif n in ("warn", "warning"):
return 30
elif n == "error":
return 40
else:
# 既定の処理を1箇所にまとめる
return 20
tests = ["INFO", "verbose", "error"]
for t in tests:
print(f"{t:8} -> {to_log_level(t)}")
INFO -> 20
verbose -> 20
error -> 40
きれいに書くコツと注意点
条件の順番で結果が変わる点に注意
悪い例(順番が不適切)
広い条件を先に書くと、後続の条件に到達できず誤判定になります。
これはバグの温床です。
# 85点は本来「優秀」にしたいが、先に 60点以上 を判定してしまっている
score = 85
if score >= 60:
print("合格") # ここで止まってしまう
elif score >= 80:
print("優秀")
else:
print("不合格")
合格
良い例(厳しい条件を先に)
より厳しい条件を先に書くことで、意図通りの分岐になります。
score = 85
if score >= 80:
print("優秀")
elif score >= 60:
print("合格")
else:
print("不合格")
優秀
ネストを避けてelifでフラットにする
ネストした例(読みにくい)
ネストしすぎると可読性が落ち、ミスも増えます。
# ネストが深くなる例
age = 20
if age >= 0:
if age < 13:
group = "child"
else:
if age < 20:
group = "teen"
else:
group = "adult"
else:
group = "invalid"
print(group)
adult
フラットな例(読みやすい)
elif
で一直線にすると読みやすく、保守もしやすいです。
age = 20
if age < 0:
group = "invalid"
elif age < 13:
group = "child"
elif age < 20:
group = "teen"
else:
group = "adult"
print(group)
adult
よくあるミス(: の付け忘れやインデント、== と =)
コロンの付け忘れ
コロン:
を忘れるとSyntaxError
です。
# 悪い例: コロンがない
# if x > 0
# print("正")
# SyntaxError: invalid syntax
インデントの不整合
インデントが揃っていないとIndentationError
になります。
スペースとタブの混在も避けましょう。
# 悪い例: インデントがない
# if x > 0:
# print("正")
# IndentationError: expected an indented block
比較演算子の誤り(== と =)
比較は==
、代入は=
です。
ここを取り違えるとエラーになります。
# 悪い例: 代入演算子を使ってしまう
# x = 3
# if x = 3:
# print("xは3") # SyntaxError
# 良い例: 比較演算子を使う
x = 3
if x == 3:
print("xは3")
xは3
まとめ
if-elif-else
は「上から順に評価して最初の一致だけを実行する」ことで、複数条件の分岐を安全かつ読みやすく書ける構文です。
実務では、カテゴリ分類や閾値ベースの判定、未知の入力の既定処理に頻出します。
書く際は、条件の順序を厳しいものから並べ、範囲が重ならないように設計し、else
でデフォルト処理をまとめると堅牢になります。
コロンとインデント、そして==
と=
の区別に気をつければ、初心者でも安心して扱えます。
さらに慣れてきたら、条件式の表現を簡潔にしていくことで、より読みやすいコードへと洗練できます。