条件分岐

前回のレッスンでは、ブール論理を使って真/偽の判断を行う方法を学びました。今回は条件分岐を学びます——条件に応じてプログラムが異なるコードを実行するようにします。これはあらゆるプログラミング言語において最も基本的な制御構造の 1 つです。


1. if 文:単純な条件

if の書式は簡単です:

PYTHON
if condition:
    code to execute when condition is True

コロン :インデント(通常 4 スペース)に注意してください——インデントはどのコードが if に属するかを Python に伝えます。

PYTHON
age = 18
if age >= 18:
    print("You are an adult!")
    print("This is also inside the if block.")

print("This is outside the if and always executes.")

出力:

TEXT
You are an adult!
This is also inside the if block.
This is outside the if and always executes.
💡 ヒント:Python はインデントを使ってコードブロックを定義します(他の言語は {} を使います)。同じ if ブロック内のコードは同じインデントを持つ必要があります。C や Java に慣れていると戸惑うかもしれませんが、Python はコードをきれいに書くことを強制します。

例:合格/不合格の確認(難易度 ⭐)

PYTHON
score = 75

if score >= 60:
    print("Congratulations, you passed!")
    print(f"Your score is {score}.")

print("Score recorded.")
▶ 試してみよう

出力:

TEXT
Congratulations, you passed!
Your score is 75.
Score recorded.

2. if-else:2 つの選択肢

条件が真のときは A を、偽のときは B を実行します:

PYTHON
if condition:
    execute when True
else:
    execute when False
PYTHON
score = 45

if score >= 60:
    print("Passed!")
else:
    print("Failed, need to retake.")

出力:

TEXT
Failed, need to retake.

if と else のインデント

PYTHON
password = "123456"

if password == "123456":
    print("Password correct, welcome back!")
else:
    print("Wrong password, try again.")
    print("If you forgot your password, click 'Forgot Password'.")
⚠️ 補足:else にもコロン : が必要です。else は対応する if と同じインデントレベルに揃える必要があります。


3. if-elif-else:複数の選択肢

実際のシナリオでは、2 つ以上の可能性があることがよくあります。elif(else if の短縮形)を使って複数の分岐を処理します:

PYTHON
if condition1:
    execute when condition1 is True
elif condition2:
    execute when condition2 is True
elif condition3:
    execute when condition3 is True
else:
    execute when none of the above are True

Python は上から下へチェックします——最初に真になった条件が実行され、その後 if-elif-else 構造全体を終了します。

PYTHON
score = 85

if score >= 90:
    print("Excellent!")
elif score >= 80:
    print("Good!")
elif score >= 70:
    print("Average.")
elif score >= 60:
    print("Pass.")
else:
    print("Failed, need to retake.")

# 出力:Good!
💡 ヒント:条件の順序に注意してください。最初に if score >= 60: を置くと、85 点は「合格」の分岐に入り、「良い」や「優秀」には到達しません。厳しい条件を先に置きましょう。

例:レストランの注文システム(難易度 ⭐⭐)

PYTHON
print("=== Today's Meals ===")
print("1. Braised Beef Noodles  $10")
print("2. Shredded Pork Rice     $8")
print("3. Tomato Egg Rice        $6")
print("4. Egg Fried Rice         $4")

choice = 3

if choice == 1:
    print("You ordered Braised Beef Noodles, $10.")
elif choice == 2:
    print("You ordered Shredded Pork Rice, $8.")
elif choice == 3:
    print("You ordered Tomato Egg Rice, $6.")
elif choice == 4:
    print("You ordered Egg Fried Rice, $4.")
else:
    print("Sorry, invalid option.")

print("Enjoy your meal!")
▶ 試してみよう

出力:

TEXT
=== Today's Meals ===
1. Braised Beef Noodles  $10
2. Shredded Pork Rice     $8
3. Tomato Egg Rice        $6
4. Egg Fried Rice         $4
You ordered Tomato Egg Rice, $6.
Enjoy your meal!

4. ネストした条件

条件の中に別の条件を含めることができます。これをネストと呼びます。

PYTHON
age = 20
has_ticket = True

if age >= 18:
    print("Adult, can enter.")
    if has_ticket:
        print("Has ticket, please proceed.")
    else:
        print("Please buy a ticket first.")
else:
    print("Minor, entry denied.")

出力:

TEXT
Adult, can enter.
Has ticket, please proceed.

ネストを深くしすぎない

ネスト自体は間違いではありませんが、3 レベル以上深くなるとコードが読みにくくなります

PYTHON
# ❌ 推奨しない:ネストが多すぎる
user_input = "y"
is_admin = True
has_permission = True

if user_input == "y":
    if is_admin:
        if has_permission:
            print("Operation successful!")
        else:
            print("No permission.")
    else:
        print("Not an admin.")
else:
    print("Operation canceled.")

論理演算子を使ってフラット化します:

PYTHON
# ✅ 推奨:and を使ってネストを減らす
user_input = "y"
is_admin = True
has_permission = True

if user_input != "y":
    print("Operation canceled.")
elif is_admin and has_permission:
    print("Operation successful!")
else:
    print("Insufficient permissions.")
💡 ヒント:実用的なルール:ネストが 3 レベルを超える場合は、andor で条件を結合するか、深いロジックを関数に抽出することを検討してください。良いコードは「深く」なく「フラット」です。

例:配送料計算機(難易度 ⭐⭐)

PYTHON
# 地域、重量、会員レベルに基づいて配送料を計算
region = "domestic"     # "domestic" または "international"
weight = 3.5            # kg
is_vip = False

if region == "domestic":
    if weight <= 1:
        shipping = 10
    elif weight <= 5:
        shipping = 15
    else:
        shipping = 20
else:
    if weight <= 1:
        shipping = 50
    elif weight <= 5:
        shipping = 80
    else:
        shipping = 120

# VIP は 20% オフ
if is_vip:
    shipping *= 0.8

print(f"Region: {region}")
print(f"Weight: {weight}kg")
print(f"Shipping: ${shipping:.0f}")
▶ 試してみよう

出力:

TEXT
Region: domestic
Weight: 3.5kg
Shipping: $15

5. 三項演算子(条件式)

Python には1 行の if-else 構文があります。これを三項演算子と呼びます:

PYTHON
# 通常の方法
age = 20
if age >= 18:
    status = "adult"
else:
    status = "minor"

# 三項演算子(1 行)
status = "adult" if age >= 18 else "minor"

print(status)   # adult

構造:

TEXT
value1 if condition else value2

条件が真なら value1、偽なら value2 を採用します。

実用的な使い方

PYTHON
# スコアに基づいて結果を出力
score = 88
result = "passed" if score >= 60 else "failed"
print(f"Exam result: {result}")   # Exam result: passed

# デフォルト値の参照
name = input("Enter your name: ") or "Guest"
greeting = f"Hello, {name}" if name else "Hello, Guest"
print(greeting)
⚠️ 補足:三項演算子は簡潔ですが、使いすぎないでください。ロジックが複雑な場合(elif が必要)や分岐が長い場合は、通常の if-elif-else を使いましょう。簡潔さ ≠ 可読性です。


6. pass:何もしない

構文上コードが必要だが、まだ何を書くか決めていない場合のプレースホルダとして pass を使います:

PYTHON
if age >= 18:
    pass    # TODO: 後で成人向けロジックを追加
else:
    print("Minor, cannot register.")

pass は「ここでは何もせず、先に進む」という意味です。主に以下の目的で使われます:

PYTHON
# 実際の使用例
if user_age >= 18:
    register_user()      # 登録を続行
else:
    pass                 # 未成年者向けの特別な処理はまだなし
💡 ヒント:VS Code を使っている場合は、pass と一緒に # TODO コメントを書きましょう。VS Code はすべての TODO 項目を収集して、後で簡単に参照できます。


よくあるユースケース


❓ よくある質問

Q elifif の違いは何ですか?なぜすべて if を使わないのですか?
A 重要な違いは、elif は前の条件が満たされなかった場合にのみチェックされるのに対し、独立した if 文は常にチェックされることです。85 点に対して 3 つの独立した if 文を使うと、「優秀」「良い」「平均」がすべて実行されます。if-elif-elif では、最初に一致した「良い」の分岐だけが実行されます。「1 つを選択」する場合は elif を、「それぞれを独立してチェック」する場合は複数の if を使います。
⚠️ Q:if condition: の後に VS Code が自動的に 4 スペースインデントするのはなぜですか? A:Python はコロンの後にインデントを必要とします。VS Code の Python 拡張機能が自動的に処理します。インデントを忘れると、Python は IndentationError: expected an indented block を発生させます。Python のインデントは「スタイルの提案」ではなく、構文です。間違ったインデントはコードが実行されないことを意味します。

Q 三項演算子で elif を使えますか?
A いいえ。三項演算子は「2 つの選択肢」しか扱えません(value1 if condition else value2)。複数の選択肢が必要な場合は、三項演算子をネストできます:a if cond1 else b if cond2 else c。しかしこれは強く推奨されません——ネストした三項演算子はほとんど読めません。複数の分岐には通常の if-elif-else を使ってください。
Q passreturn の違いは何ですか?
A pass は「何もせず、実行を続ける」という意味です。return は「現在の関数を即座に終了し、値を返す」という意味です(後で説明します)。if ブロック内で pass を使うとそのブロックをスキップして続行します。関数内で return を使うと関数を即座に終了します。これらはまったく異なる概念です。

📖 まとめ

  • if の後に条件を記述。真ならインデントされたブロックが実行される
  • else は偽の場合を処理。単独では使えない
  • elif は複数の分岐を処理。上から下へチェックされ、最初に真になったものが実行される
  • ネストした条件は複雑な階層を処理するが、ネストは 3 レベル以内に抑える
  • 三項演算子 x if condition else y はシンプルな 1 行の選択に
  • pass は構文上コードが必要だがまだ何も書くことがない場合のプレースホルダ
  • 良い習慣:厳しい条件を先に、ネストは 3 レベル以内、可能なら andor でフラット化

📝 練習問題

  1. 基本(難易度 ⭐):数値が奇数か偶数かをチェックするプログラムを書いてください。整数を入力し、「odd」または「even」を出力します。ヒントn % 2 == 0 は偶数を意味します。

  2. 中級(難易度 ⭐⭐):BMI 健康評価プログラムを書いてください。体重(kg)と身長(m)を入力し、BMI を計算して出力します:

    • BMI < 18.5 → 「Underweight」
    • 18.5 ≤ BMI < 24 → 「Normal」
    • 24 ≤ BMI < 28 → 「Overweight」
    • BMI ≥ 28 → 「Obese」
  3. 挑戦(難易度 ⭐⭐⭐):簡単な電卓を書いてください。プログラムは 3 つの入力を受け付けます:最初の数値、演算子(+ - * /)、2 番目の数値。演算を実行し、結果を出力します。以下の処理を追加:

    • ゼロによる除算:「Cannot divide by zero」と出力
    • 無効な演算子:「Invalid operator」と出力
    • 通常の場合:計算結果を出力
100%