Python | 文法の基本:elif

Python
スポンサーリンク

elif の概要(複数条件を順番に判定する)

elif は「else if」の略で、ひとつの分岐の中で条件を順番に並べ、最初に合致したブロックだけを実行するための構文です。if の直後、または別の elif の直後に続けて書きます。elif を使うと「条件の優先順位」をコードで自然に表現でき、複数の場合分けを読みやすく整理できます。


基本構文と評価の流れ(ここが重要)

if → elif → else の一列で“排他的”に判定する

ひとつの if 連鎖では、上から順に条件が評価され、最初に True になったブロックだけが実行されます。その後の条件は評価されません。どれにも当てはまらないときの最後の受け皿が else です。

score = 85
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "D"
print(grade)  # "B"
Python

ポイントは「排他性」です。上の例では 85 は「>=80」に当てはまるので、後ろの「>=70」には進みません。範囲の重なりや順番の誤りがあると、意図しない判定になります。

インデントとコロンを正しく揃える

elif と else は、先行する if と同じ深さに置きます。行末の「:」と、その次の行のインデント開始が必須です。

temperature = 25
if temperature >= 30:
    print("暑い")
elif temperature >= 20:  # if と同じ深さ
    print("快適")
else:                    # if と同じ深さ
    print("少し涼しい")
Python

条件設計のコツ(優先順位・範囲・重なりの扱い)

より“狭い・強い”条件から書く

複数条件が重なり得る場合は、より限定的(強い)条件を先に、一般的(弱い)条件を後に書きます。これで意図した優先順位が保てます。

def classify(amount):
    if amount >= 10_000 and amount % 2 == 0:  # 強い条件(両方満たす)
        return "VIP-偶数"
    elif amount >= 10_000:                    # 弱い条件(片方)
        return "VIP"
    else:
        return "REGULAR"
Python

範囲判定は“重なりを作らない”並べ方にする

数値の帯では、上限・下限の境界を明確にし、重複しないように並べます。連鎖比較を使うと読みやすさが上がります。

age = 15
if age < 6:
    fee = 0
elif 6 <= age < 13:
    fee = 300
elif 13 <= age < 18:
    fee = 500
else:
    fee = 800
Python

elif と複数の if の違いを理解する

elif は「最初にマッチしたひとつだけ」実行します。複数の独立した if は「条件が True ならそれぞれ実行」されます。排他にしたいのか、同時適用を許すのかで使い分けます。

# 排他的(どれかひとつ)
if x > 10:
    ...
elif x > 5:
    ...
# 非排他的(両方あり得る)
if is_member:
    apply_member_discount()
if has_coupon:
    apply_coupon()
Python

よくある落とし穴と防ぎ方(重要ポイントを深掘り)

並び順のミスで“上書き”される

「広い条件」を先に置くと、後ろの「狭い条件」に到達しません。テストケース(境界値)を用意して順序の妥当性を確認しましょう。

# 悪い例:>=80 が先に来てしまい、>=90 に到達しない
if score >= 80:
    grade = "B"
elif score >= 90:
    grade = "A"
Python

境界の“抜け漏れ”に注意

帯の間に穴があると、想定外に else へ落ちます。すべての入力空間がどこかに属するように範囲を設計します。必要なら最後に「検証用の else」で例外を出すのも安全策です。

if 0 <= score <= 100:
    ...
else:
    raise ValueError("score は 0〜100 の範囲で")
Python

複雑化の兆候が出たら“辞書や関数”へ逃がす

elif の列が長くなり、定数マッピングに近づいているなら、辞書や関数分配に置き換えると保守性が上がります。

actions = {
    "start": lambda: print("開始"),
    "stop":  lambda: print("停止"),
    "pause": lambda: print("一時停止"),
}
cmd = "pause"
(actions.get(cmd) or (lambda: print("不明")))()
Python

実用例題(初心者がつまずきやすい場面を整理)

例題1:ステータスに応じたルーティング

def route(status: str):
    status = status.strip().casefold()
    if status == "new":
        return "登録画面"
    elif status == "active":
        return "ダッシュボード"
    elif status == "suspended":
        return "問い合わせ窓口"
    else:
        return "404"

print(route("Active"))  # ダッシュボード
Python

例題2:時間帯メッセージ(重なりなしの帯)

def greeting(hour: int):
    if 5 <= hour < 12:
        return "おはよう"
    elif 12 <= hour < 18:
        return "こんにちは"
    elif 18 <= hour < 24:
        return "こんばんは"
    else:
        return "時間が不正です"

print(greeting(21))  # こんばんは
Python

例題3:送料計算(優先順位を明示)

def shipping(cost: int, is_prime: bool, region: str) -> int:
    if is_prime:
        return 0                    # 会員は最優先で無料
    elif cost >= 5000:
        return 0                    # 一定額以上は無料
    elif region == "remote":
        return 800                  # 遠隔地は上書き(残りの条件に当てはまらないとき)
    else:
        return 400

print(shipping(3000, False, "remote"))  # 800
Python

例題4:スコア分類(テストしやすい境界設計)

def to_grade(score: int) -> str:
    if not (0 <= score <= 100):
        raise ValueError("0〜100の範囲で")
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    else:
        return "D"

for s in (90, 80, 70, 69):
    print(s, to_grade(s))
Python

まとめ(押さえるべき重要ポイント)

elif は「条件の優先順位を、上から下へ“排他的”に表現する」ための道具です。強い条件から並べ、範囲は重複や穴がないように設計し、境界値でテストして順序の妥当性を確認しましょう。排他的にしたいなら if/elif/else、同時適用を許すなら独立した複数の if。列が長くなったら辞書や関数分配へリファクタリングを検討すると、読みやすさと保守性がぐっと上がります。

タイトルとURLをコピーしました