Python / LESSON 04 / PY04

Python:条件分岐(if / elif / else)

1学習の目的

2基礎解説

やりたいこと書き方意味
1つだけ判定if 条件:条件がTrueのときだけ中を実行
2つに分けるif 条件: / else:どちらか一方だけ必ず実行
3つ以上に分けるif / elif / else上から順に見て、最初にTrueの1つだけ
1行で書くA if 条件 else B三項演算子。代入とセットで使う
✅ 覚えるべき重要ポイント
  1. 条件の後ろの : と、次の行のインデント(半角スペース4つ)がセット。Pythonは { } を使わず字下げでブロックを表す。
  2. 字下げがズレると IndentationError。エディタの「スペース4」設定を最初に確認しておく。
  3. elif は上から順に評価され、最初にTrueになった1つだけ実行される。だから条件は厳しい順に書く
  4. 00.0""[]None はFalse扱い(falsy)。if name: だけで「空でなければ」を表せる。
  5. if x == True: とは書かず if x: と書く。範囲判定は if 60 <= score < 80: と連鎖比較で書ける。

現場使用例:送料無料の判定 if total >= 5000:、会員ランクの振り分け if / elif / else、フォームの入力チェック if not name:、APIの応答コード分岐 if status == 200:

score = 78

if score >= 90:
    rank = "S"
elif score >= 75:
    rank = "A"
elif score >= 60:
    rank = "B"
else:
    rank = "C"

print(f"{score}点 → ランク{rank}")   # 78点 → ランクA

# 2択なら1行で書ける(三項演算子)
status = "合格" if score >= 60 else "不合格"
print(status)

3基本ドリル(10問)

PY04-D01 age = 20 のとき、18以上なら「成人です」と出力せよ。 コーディング★☆☆無料
期待される結果

出力 == 成人です

ヒント

if 条件: の次の行を半角スペース4つ字下げする。

模範解答
age = 20
if age >= 18:
    print("成人です")
解説

if文の最小形。コロンと字下げは必ずセット。この2つを落とすのが最初のつまずきポイント。

PY04-D02 if age >= 18: の次の行を字下げしなかった場合に起きるエラーはどれか。
A. NameError B. IndentationError C. TypeError D. エラーにならない
選択★☆☆無料
期待される結果

解答 == B

ヒント

Pythonは字下げでブロックを判断する。

模範解答
B
解説

IndentationError は「字下げがおかしい」という意味。Python学習で最も多く出会うエラーのひとつ。

PY04-D03 temp = 30 のとき、25より大きければ「暑い」、そうでなければ「暑くない」と出力するコードを完成させよ。 穴埋め★☆☆無料
コード
temp = 30
if temp > 25:
    print("暑い")
____:
    print("暑くない")
期待される結果

出力 == 暑い

ヒント

「それ以外」を表すキーワード。条件は書かない。

模範解答
else:
解説

else に条件は書けない(else 条件: はエラー)。「残り全部」を受け止める役割。

PY04-D04 n = -5 が「正の数」「負の数」「ゼロ」のどれかを if / elif / else で判定して出力せよ。 コーディング★☆☆無料
期待される結果

出力 == 負の数

ヒント

n > 0 → 正、n < 0 → 負、残りがゼロ。

模範解答
n = -5
if n > 0:
    print("正の数")
elif n < 0:
    print("負の数")
else:
    print("ゼロ")
解説

3分岐の基本形。最後の else は「それ以外は必ずゼロ」なので条件を書く必要がない。

PY04-D05 score = 95 のとき、if score >= 60: print("B") / elif score >= 90: print("A") と書いた場合の出力はどれか。
A. A B. B C. AとBの両方 D. 何も出ない
選択★☆☆無料
期待される結果

解答 == B

ヒント

elifは上から順に見て、最初にTrueになった1つだけ。

模範解答
B
解説

95は最初の「60以上」で止まるのでBが出る。elifは厳しい条件から先に書くのが鉄則。この順番ミスは実務でも起きるバグ。

PY04-D06 price = 4800 のとき、5000円以上なら送料0円、未満なら送料600円として「送料:600円」の形式で出力せよ。 コーディング★★☆無料
期待される結果

出力 == 送料:600円

ヒント

if / else で fee に代入してから print する。

模範解答
price = 4800
if price >= 5000:
    fee = 0
else:
    fee = 600
print(f"送料:{fee}円")
解説

「分岐で変数に入れて、最後にまとめて出力する」形はprint重複を避けられて読みやすい。実務コードの定番パターン。

PY04-D07 score = 72 を「60以上なら合格、そうでなければ不合格」と1行で result に代入するコードを完成させよ。 穴埋め★★☆無料
コード
score = 72
result = "合格" ____ score >= 60 ____ "不合格"
print(result)
期待される結果

出力 == 合格

ヒント

三項演算子。「値 if 条件 else 値」の語順。

模範解答
result = "合格" if score >= 60 else "不合格"
解説

三項演算子は「2択で値を決めるだけ」のときに使う。処理が2行以上になるなら普通のif文にする方が読みやすい。

PY04-D08 name = "" のとき if name: の中身は実行されるか。
A. 実行される B. 実行されない C. エラーになる D. 環境による
選択★★☆無料
期待される結果

解答 == B

ヒント

空文字はTrue/Falseどちら扱いか。

模範解答
B
解説

空文字・0・空リスト・None は False 扱い(falsy)。だから if not name: だけで「未入力チェック」が書ける。

PY04-D09 stock = 3, is_open = True のとき、在庫が1以上 かつ 営業中 なら「購入可能」、それ以外は「購入不可」と出力せよ。 コーディング★★☆無料
期待される結果

出力 == 購入可能

ヒント

and で2つの条件をつなぐ。is_open は既にboolなので == True は不要。

模範解答
stock = 3
is_open = True
if stock >= 1 and is_open:
    print("購入可能")
else:
    print("購入不可")
解説

PY03で学んだ論理演算子がそのまま条件に使える。boolの変数はそのまま条件に置くのがPythonらしい書き方。

PY04-D10 fruit = "みかん" が items = ["りんご", "みかん", "ぶどう"] に含まれていれば「取扱あり」、なければ「取扱なし」と出力せよ。 コーディング★★☆無料
期待される結果

出力 == 取扱あり

ヒント

「含まれるか」を調べる演算子がある。

模範解答
fruit = "みかん"
items = ["りんご", "みかん", "ぶどう"]
if fruit in items:
    print("取扱あり")
else:
    print("取扱なし")
解説

in 演算子は「A または B または C…」の長い条件をひとまとめにできる。次章以降のリスト操作でも多用する。

4実践シナリオ(5問)

PY04-S01 【会員ランク判定】年間購入額 amount = 87000 から、10万円以上「ゴールド」/5万円以上「シルバー」/それ未満「ブロンズ」と判定し、「年間87,000円 → シルバー会員」の形式で出力せよ。 コーディング★★☆無料
期待される結果

出力 == 年間87,000円 → シルバー会員

ヒント

厳しい条件(10万以上)から先に書く。金額は :, でカンマ整形。

模範解答
amount = 87000
if amount >= 100000:
    rank = "ゴールド"
elif amount >= 50000:
    rank = "シルバー"
else:
    rank = "ブロンズ"
print(f"年間{amount:,}円 → {rank}会員")
解説

ランク判定はEC・CRMで必ず出てくる処理。条件の順番を逆にすると全員ブロンズになる典型バグに注意。

PY04-S02 【BMI判定】height = 1.72(m), weight = 78(kg)から BMI = 体重 ÷ 身長² を計算し、25以上「肥満」/18.5未満「痩せ」/その他「標準」と判定して「BMI:26.4 → 肥満」の形式で出力せよ。BMIは小数1桁表示。 コーディング★★☆無料
期待される結果

出力 == BMI:26.4 → 肥満

ヒント

身長の2乗は height ** 2。表示は {bmi:.1f}。

模範解答
height = 1.72
weight = 78
bmi = weight / height ** 2

if bmi >= 25:
    judge = "肥満"
elif bmi < 18.5:
    judge = "痩せ"
else:
    judge = "標準"

print(f"BMI:{bmi:.1f} → {judge}")
解説

「計算 → 判定 → 整形出力」の3ステップ構成。健康アプリや検査データ処理はほぼこの形で書かれている。

PY04-S03 【入力バリデーション】user_name = "", password = "abc123" をチェックし、名前が空なら「名前を入力してください」/パスワードが8文字未満なら「パスワードは8文字以上にしてください」/両方問題なければ「登録できます」と、最初に見つかった1件だけ出力せよ。 コーディング★★☆無料
期待される結果

出力 == 名前を入力してください

ヒント

空文字はfalsyなので not user_name で判定できる。文字数は len()。elifでつなぐと1件だけ出る。

模範解答
user_name = ""
password = "abc123"

if not user_name:
    print("名前を入力してください")
elif len(password) < 8:
    print("パスワードは8文字以上にしてください")
else:
    print("登録できます")
解説

会員登録フォームのチェック処理そのもの。elif でつなぐと「最初のエラーだけ表示」、if を並べると「全エラー表示」になる。仕様に応じて使い分ける。

PY04-S04 【割引計算】price = 12000, is_member = True, coupon = False。会員なら10%引き(整数に切り捨て)、さらにクーポンがあれば500円引き、結果がマイナスなら0円とし、「支払額:10,800円」の形式で出力せよ。 コーディング★★★無料
期待される結果

出力 == 支払額:10,800円

ヒント

「会員割引」「クーポン」「マイナス補正」は互いに独立した条件。elif ではなく if を3つ並べて上から順に価格を更新していく。

模範解答
price = 12000
is_member = True
coupon = False

if is_member:
    price = int(price * 0.9)
if coupon:
    price = price - 500
if price < 0:
    price = 0

print(f"支払額:{price:,}円")
解説

elif と if の並列は意味が違うという最重要ポイント。「どれか1つ」なら elif、「全部それぞれ適用」なら if を並べる。ここを取り違えると割引が1つしか効かないバグになる。

PY04-S05 【うるう年判定】year = 2100 がうるう年かを判定して「2100年:平年」の形式で出力せよ。
ルール:4で割り切れる年はうるう年。ただし100で割り切れる年は平年。ただし400で割り切れる年はうるう年。
コーディング★★★無料
期待される結果

出力 == 2100年:平年

ヒント

「例外の例外」があるので、400 → 100 → 4 の順に判定する。

模範解答
year = 2100

if year % 400 == 0:
    leap = True
elif year % 100 == 0:
    leap = False
elif year % 4 == 0:
    leap = True
else:
    leap = False

print(f"{year}年:{'うるう年' if leap else '平年'}")
解説

条件の順番がすべてを決める教科書的な問題。4から先に書くと2100年が誤判定される。実際にこのバグを埋め込んだシステム障害は何度も起きている。

5仕上げ課題

PY04-FINAL 【宅配便の料金判定スクリプト】以下の変数から配送料金を計算し、3行で出力するスクリプトを書け。
weight = 4.2(kg)/size = 95(3辺合計cm)/area = "関西"/is_member = True

料金ルール:
① サイズ100cm以下 かつ 重量5kg以下 → 基本900円・区分「通常サイズ」。それ以外 → 基本1400円・区分「大型サイズ」
② 地域加算:関東 +0円/関西 +200円/その他 +500円
③ 会員なら最後に合計から10%引き(整数に切り捨て)

出力仕様(3行):
=== 配送料金 ===
区分:通常サイズ(95cm / 4.2kg)
請求額:990円(関西 / 会員割引あり)
期待される結果

出力3行が完全一致

ヒント

①②③は独立した判定なので、if群を3つに分けて上から順に計算する。基本料金 → 地域加算 → 会員割引の順。最後の「会員割引あり/なし」は三項演算子で埋め込める。

模範解答
weight = 4.2
size = 95
area = "関西"
is_member = True

# ① サイズ区分と基本料金
if size <= 100 and weight <= 5:
    base = 900
    kind = "通常サイズ"
else:
    base = 1400
    kind = "大型サイズ"

# ② 地域加算
if area == "関東":
    extra = 0
elif area == "関西":
    extra = 200
else:
    extra = 500

# ③ 会員割引
total = base + extra
if is_member:
    total = int(total * 0.9)

print("=== 配送料金 ===")
print(f"区分:{kind}({size}cm / {weight}kg)")
print(f"請求額:{total:,}円({area} / {'会員割引あり' if is_member else '会員割引なし'})")
解説

実務の料金計算はほぼこの構造で書かれている。条件の塊ごとにif群を分け、変数を上から積み上げる——この設計ができていれば、後から「離島は+800円」「学割を追加」といった仕様変更が来ても壊れずに拡張できる。ここまで書けたら条件分岐は合格。