Pythonのif、elif、elseは、プログラムの流れを分岐させるための最重要構文です。
しかし、条件の順番や書き方を間違えると、思った動作にならなかったり、コードが読みづらくなってしまいます。
本記事では、「elifとelseをいつ・どう書くべきか」を、基本から実践パターン、リファクタリングまで丁寧に解説します。
Pythonのelifとelseとは何か
ifとの違いと基本構造
まずは、if・elif・elseがどのように組み合わさるのか、全体像から確認します。

if・elif・elseの基本的な関係
Pythonの条件分岐は、次の3つのキーワードで構成されます。
if:最初の条件判定elif:それ以外の条件を順番に追加するelse:どの条件にも当てはまらない場合の処理
重要なのは「上から順番に評価され、どれか1つが実行されたら、そこで分岐は終わる」という点です。
典型的な構造のイメージ
score = 75
if score >= 80:
print("とてもよくできました") # 条件1にマッチ
elif score >= 60:
print("合格です") # 条件1がダメで、条件2にマッチ
else:
print("不合格です") # どの条件にもマッチしない場合
このコードでは、scoreが80以上か、60以上か、それ以外かでメッセージを出し分けています。
実際の実行結果は次のようになります。
合格です
elifとelseの役割の違い

elifは「別の条件を順番に試す」
elifは「ifがダメだったときの、別の条件」を書くためのキーワードです。
必要なだけ何個でも並べることができます。
x = 0
if x > 0:
print("正の数です")
elif x < 0:
print("負の数です")
elif x == 0:
print("ゼロです")
このように、elifには必ず条件式を書きます。
elseは「どれにも当てはまらない最後の受け皿」
elseは「上に書かれたどの条件にも当てはまらなかった場合に実行する処理」です。
条件式は書きません。
command = "exit"
if command == "start":
print("開始します")
elif command == "stop":
print("停止します")
else:
print("不明なコマンドです") # startでもstopでもない場合
「elseは1つだけ・一番最後に書く」というルールを覚えておくと混乱しにくくなります。
Pythonにswitch文がない理由とelifの位置づけ
他の言語(C, Java, JavaScriptなど)にはswitch文がありますが、Pythonにはありません。
その代わりとしてif / elif / elseや辞書などを使います。

なぜswitchがなくても困らないか
Pythonでは、次のような特徴があります。
if / elif / elseが簡潔に書ける- 関数や辞書を使った表現力が高い
- Python 3.10以降には
match文(構造的パターンマッチ)が追加された
そのため、「シンプルな条件分岐はif/elifで」「マッピングできるものは辞書で」「複雑なパターンはmatchで」という使い分けが一般的です。
elifとelseの書き方と使い方の基本
if elif elseの基本構文

基本構文
Pythonのif / elif / elseの基本形は次のようになります。
value = 10 # 例として何か値を用意
if 条件式1:
# 条件式1がTrueのときに実行される処理
...
elif 条件式2:
# 条件式1がFalseで、条件式2がTrueのときに実行される処理
...
elif 条件式3:
# 条件式1,2がFalseで、条件式3がTrueのときに実行される処理
...
else:
# 上のすべての条件がFalseのときに実行される処理
...
実際の動く例を示します。
age = 20
if age < 13:
print("子ども料金です")
elif age < 20:
print("学生料金です")
else:
print("大人料金です")
学生料金です
「ifは1つ必須」「elifは0個以上」「elseは0または1個、一番最後」という構成を覚えておきましょう。
条件分岐を書く順番とベストプラクティス

条件は「狭いものから広いもの」「よく起きるものから」がおすすめ
条件分岐の順番は、次の2つの観点で決めると読みやすくなります。
1つ目は「より限定的な条件(狭い条件)を先に書く」ことです。
# 悪い例: 広い条件が先に来ている
if age >= 0:
print("年齢が0以上です")
elif age >= 20:
print("大人です") # ここには絶対に来ない
# 良い例: 狭い条件から先に
if age >= 20:
print("大人です")
elif age >= 0:
print("年齢が0以上です")
2つ目は「よく発生するケースを先に書く」ことです。
頻度の高い条件を先に評価すれば、全体の実行スピードがわずかに向上し、読み手も「よくあるケースから順に書かれている」と理解しやすくなります。
elifを使うケース・使わないケース
elifを使う方が良いケース
elifは「互いに排他的な選択肢が複数あるとき」に特に向いています。
score = 72
if score >= 80:
print("A")
elif score >= 70:
print("B")
elif score >= 60:
print("C")
else:
print("D")
このように「どれか1つだけを選択したい」状況にぴったりです。
elifを使わない方が良いケース
逆に、elifよりifを並べた方が良いケースもあります。
それは「条件が独立していて、複数が同時に成り立つ可能性があるとき」です。
x = 15
# それぞれ独立してチェックしたい場合
if x % 3 == 0:
print("3の倍数です")
if x % 5 == 0:
print("5の倍数です")
elifを使うと、最初にマッチした1つだけしか実行されません。
# 間違った書き方(3と5の倍数両方を検出したいのに…)
if x % 3 == 0:
print("3の倍数です")
elif x % 5 == 0:
print("5の倍数です")
この違いはよくミスにつながるので、「複数ヒットしてもよいか」「1つだけ選びたいか」を意識して使い分けることが大切です。
elseを省略してよい場合と注意点

elseは「必ずしも必要ではない」
elseは省略しても構いません。
「どの条件にも当てはまらなかったとき、特に何もしなくてよい」のであれば、省略しても問題ありません。
name = input("名前を入力してください: ")
if name == "":
print("名前が空です")
# nameが空でなければ、このまま何も表示しない
注意点: elseに「本当に来てほしくない」処理を書かない
ありがちな失敗は、「本当に来てほしくないケース」をelseに書いてしまうことです。
条件漏れがあっても、すべてelseに吸い込まれてしまうため、バグに気づきにくくなります。
# 良くない例
if status == "ready":
start_job()
elif status == "stopped":
stop_job()
else:
# 本当はここには来てほしくないが、条件漏れも全部ここに来てしまう
restart_job()
このような場合は、明示的に条件を列挙し、想定外の値はエラーにする方が安全です。
if status == "ready":
start_job()
elif status == "stopped":
stop_job()
elif status == "paused":
pause_job()
else:
raise ValueError(f"未知のstatusです: {status}")
elifとelseの実践パターン集
数値判定でのelifの使い方

点数から評価を判定する
def grade(score: int) -> str:
"""点数から評価(A〜D)を返す関数"""
if score >= 80:
return "A"
elif score >= 60:
return "B"
elif score >= 40:
return "C"
else:
return "D"
print(grade(85))
print(grade(72))
print(grade(50))
A
B
C
このときのポイントは、「条件が上から下へ、だんだん緩くなっている」ことです。
こうしておくと、60〜69点が2つの条件に引っかかるような矛盾が起きにくくなります。
文字列判定でのelif

コマンド文字列に応じて処理を分ける
command = input("コマンド(start/stop/status)を入力してください: ")
if command == "start":
print("処理を開始します")
elif command == "stop":
print("処理を停止します")
elif command == "status":
print("処理の状態を表示します")
else:
print("不明なコマンドです")
コマンド(start/stop/status)を入力してください: status
処理の状態を表示します
文字列判定では「完全一致なのか、大文字小文字を無視するのか」を決めておくと、条件がわかりやすくなります。
例えば、大文字小文字を無視したい場合は、次のように書きます。
command = input("コマンドを入力してください: ").lower() # 小文字に変換
if command == "start":
...
複数条件を組み合わせたelif

and / or を使った組み合わせ
andやorを使うと、複数の条件をまとめて書けます。
def get_discount_rate(is_member: bool, total: int) -> int:
"""会員かどうかと合計金額から割引率を決める"""
if is_member and total >= 10000:
return 20 # 会員かつ1万円以上: 20%引き
elif is_member and total >= 5000:
return 10 # 会員かつ5000円以上: 10%引き
elif is_member:
return 5 # 会員のみ: 5%引き
elif total >= 10000:
return 3 # 非会員だが1万円以上: 3%引き
else:
return 0 # それ以外: 割引なし
print(get_discount_rate(True, 12000))
print(get_discount_rate(True, 6000))
print(get_discount_rate(False, 12000))
print(get_discount_rate(False, 3000))
20
10
3
0
条件が複雑になってきたら、「優先度の高いケースを上に」「意味のかたまりごとに空行やコメントを挟む」など、読みやすさにも気を配るとよいです。
ネストしたifとelifの書き換えパターン

ネストが深いコードの例
age = 20
has_ticket = True
if age >= 18:
if has_ticket:
print("入場できます")
else:
print("チケットが必要です")
else:
print("18歳未満は入場できません")
このような「ifの中にif」が多くなると、コードが右にどんどん押し出されて読みにくくなります。
elifや論理演算子で平坦に書き換える
次のように論理演算子とelifを使って1段にまとめると、見通しがよくなります。
age = 20
has_ticket = True
if age < 18:
print("18歳未満は入場できません")
elif not has_ticket:
print("チケットが必要です")
else:
print("入場できます")
この書き換えでは、「入場できない条件」を先に処理し、それ以外は最後のelseでまとめて「入場できる」としています。
「ダメな条件から先に弾いていく」書き方は、if文をシンプルに保つうえで非常に有効です。
辞書やマッピングでelifを減らすリファクタリング

単純な値分岐は辞書で置き換えられる
同じ「キー」に対して、その「処理」や「値」を返すだけなら、長いelifチェーンを辞書に置き換えられることが多いです。
def get_weekday_name(n: int) -> str:
"""数字から曜日名を返す(0:月〜6:日)"""
if n == 0:
return "月"
elif n == 1:
return "火"
elif n == 2:
return "水"
elif n == 3:
return "木"
elif n == 4:
return "金"
elif n == 5:
return "土"
elif n == 6:
return "日"
else:
return "不明"
これを辞書で表現すると、次のように書けます。
def get_weekday_name(n: int) -> str:
"""数字から曜日名を返す(辞書版)"""
mapping = {
0: "月",
1: "火",
2: "水",
3: "木",
4: "金",
5: "土",
6: "日",
}
# dict.get(key, default) で見つからないときのデフォルト値を返す
return mapping.get(n, "不明")
print(get_weekday_name(3))
print(get_weekday_name(6))
print(get_weekday_name(10))
木
日
不明
「値 → 結果」の対応がはっきりしているときは、if/elifより辞書の方がスッキリします。
関数を辞書に入れて処理を切り替える
処理内容を切り替えたいときも、関数を辞書に入れることでelifを減らせます。
def start():
print("開始します")
def stop():
print("停止します")
def unknown():
print("不明なコマンドです")
actions = {
"start": start,
"stop": stop,
}
command = input("コマンドを入力してください: ")
# 見つからないときは unknown 関数を返す
action = actions.get(command, unknown)
action() # 選ばれた関数を実行
コマンドを入力してください: start
開始します
このパターンは、「コマンドの種類が増えたときに、if文を増やさずに対応できる」という利点があります。
例外処理(try except else)とif elseの違い

if / elseは「自分で条件を決める」
if / elif / elseは、自分で条件式を指定して分岐します。
text = "123"
if text.isdigit():
value = int(text)
print("変換できました:", value)
else:
print("数字ではありません")
try / except / elseは「エラーが起きたかどうか」で分岐する
一方、try / except / elseは「処理中に例外(エラー)が発生したかどうか」で分岐します。
text = "123"
try:
value = int(text) # ここでエラーが出るかもしれない
except ValueError:
print("数字に変換できませんでした")
else:
print("変換できました:", value)
変換できました: 123
else節は「例外が起きなかったときに実行される処理」です。
名前は同じelseですが、ifのelseとは役割が少し異なります。
if ... else:条件式がTrue/Falseで分岐try ... except ... else:例外が発生した/しなかったで分岐
どちらを使うべきか迷ったら、「想定内の分岐」ならif、「想定外のエラー」ならtry/exceptという目安で考えるとよいです。
elifとelseでよくあるミスと改善ポイント
インデント(字下げ)ミスで起きるエラーと対処

インデントは「ブロックの境界」を表す
Pythonではインデント(字下げ)がそのままブロックの範囲になります。
ここでミスをすると、IndentationErrorやSyntaxErrorが発生します。
間違った例を見てみます。
score = 80
if score >= 70:
print("合格です") # ← インデントが足りない
このコードを実行すると、次のようなエラーになります。
File "example.py", line 4
print("合格です")
^
IndentationError: expected an indented block
正しくは、ifの中の行をインデントする必要があります。
score = 80
if score >= 70:
print("合格です") # ← 4スペース(またはタブ)で字下げ
インデント幅を混在させない
もう1つありがちな失敗として、タブとスペースを混ぜてしまうケースがあります。
エディタの設定で「インデント文字はスペースに統一する」ようにしておくと安心です。
条件の抜け・重複とバグの見つけ方

条件が抜けてしまうパターン
次のようなコードでは「60点ちょうど」のケースが抜け落ちています。
score = 60
if score > 80:
print("A")
elif score > 70:
print("B")
elif score > 60:
print("C")
else:
print("D") # 60点はここに来てしまう
「>」と「>=」を混ぜたときに、このような境界ミスが起きやすくなります。
なるべく一貫して>=を使い、上から範囲を埋めていくようにすると安全です。
条件が重複してしまうパターン
次の例では、score >= 60という条件が2回出てきています。
score = 75
if score >= 60:
print("合格")
elif score >= 70:
print("高得点") # ここには絶対に来ない
上から順番に評価されるため、「先の条件が後ろの条件を飲み込んでしまう」ことがあります。
「より広い条件は後ろに書く」というルールを意識すると、この種のバグは避けやすくなります。
バグを見つける具体的なコツ
- 端の値(境界値)でテストする(例: 59, 60, 61点)
- すべての条件がカバーされているか、紙やメモで範囲を書き出す
- 条件を整理して、重なっていないか目で確認する
長くなりすぎたelifチェーンの改善方法

パターン1: 辞書に移す
「値に応じて別の値を返すだけ」のelifチェーンは、先ほど紹介したように辞書で置き換えられます。
パターン2: 関数に分割する
複雑な条件を1つのif文で扱っている場合は、条件ごとに関数を分けるとスッキリします。
def is_child(age: int) -> bool:
return age <= 12
def is_teen(age: int) -> bool:
return 13 <= age <= 19
def is_adult(age: int) -> bool:
return age >= 20
age = 17
if is_child(age):
print("子ども料金")
elif is_teen(age):
print("学生料金")
elif is_adult(age):
print("大人料金")
ロジックを関数に切り出すと、条件の意味が名前として現れるので、読みやすさが大きく向上します。
可読性の高いif elif elseの書き方のコツ

コツ1: 条件に名前をつける
条件式が長く複雑なときは、一度変数に代入して名前をつけると読みやすくなります。
# 読みにくい例
if user.is_active and not user.is_banned and user.age >= 18:
...
# 読みやすい例
is_valid_user = user.is_active and not user.is_banned and user.age >= 18
if is_valid_user:
...
コツ2: 早期returnでネストを浅くする
関数の中でifが深くネストしてしまう場合は、「ダメなケースを先にreturnしてしまう」と、残りの処理がフラットになります。
# ネストが深い例
def process(user):
if user.is_active:
if not user.is_banned:
print("処理を実行します")
# 早期returnを使った例
def process(user):
if not user.is_active:
return
if user.is_banned:
return
print("処理を実行します")
コツ3: コメントで意図を残す
if文は「なぜこの条件なのか」が後から見えにくくなりがちです。
境界値やビジネスルールがある場合は、短いコメントを添えておくと、将来の自分や他人が理解しやすくなります。
# 13歳以上は保護者の同意があれば登録できる
if age >= 13 and has_parent_permission:
...
まとめ
Pythonのelifとelseは、「どれか1つの道筋だけを選ぶ」ための重要な構文です。
条件分岐は、順番や範囲の取り方を間違えるとバグにつながりやすいため、狭い条件から広い条件へ並べることや、必要に応じて辞書や関数へ分離することが大切です。
また、例外処理のtry / except / elseとの違いを意識しつつ、「想定内の分岐はif」「想定外のエラーはtry」で使い分けると、より明快なコードになります。
今回紹介したパターンやリファクタリングのコツを活用して、読みやすく安全な条件分岐を書けるようになりましょう。
