データを読み込み中...

前回の教材では、if文とif-else文を使って2つの選択肢から1つを選ぶ方法を学びました。この教材では、さらに複雑な条件分岐を扱えるようになります。
学習内容:
前回学んだif-else文は、「条件を満たすか、満たさないか」という2択の判断しかできません。しかし、実際には3つ以上の選択肢から1つを選びたい場合があります。
例えば、成績評価を考えてみましょう。
このように、複数の条件を順番にチェックしていく場合、elif(else ifの略)を使います。
if 条件1:
# 条件1がTrueのときの処理
elif 条件2:
# 条件1がFalseで、条件2がTrueのときの処理
elif 条件3:
# 条件1と2がFalseで、条件3がTrueのときの処理
else:
# すべての条件がFalseのときの処理
重要なポイント:
score = 75
if score >= 80:
grade = "優"
elif score >= 60:
grade = "良"
elif score >= 40:
grade = "可"
else:
grade = "不可"
print("評価: {}".format(grade))
このプログラムの動作を詳しく見てみましょう。
scoreは75なので、score >= 80はFalsescore >= 60をチェック → Truegrade = "良"が実行されるscore >= 40とelse)はチェックされないなぜscore >= 60だけで「60点以上80点未満」を表現できるのか?
これは、上から順番にチェックされるという性質を利用しています。score >= 60にたどり着いた時点で、すでにscore >= 80がFalseだとわかっているため、自動的に「60点以上80点未満」という範囲になるのです。
よく間違えるパターンとして、elifの代わりにifを使ってしまうことがあります。この2つは大きく異なります。
# elifを使った場合(正しい)
score = 85
if score >= 80:
print("優秀です")
elif score >= 60:
print("合格です")
else:
print("もう一度頑張りましょう")
出力:
優秀です
score >= 80がTrueなので、score >= 60はチェックされません。
# ifを複数使った場合(意図しない動作)
score = 85
if score >= 80:
print("優秀です")
if score >= 60: # elifではなくif
print("合格です")
出力
優秀です
合格です
どちらのif文も独立してチェックされるため、両方の条件がTrueになり、両方のメッセージが表示されてしまいます。
条件分岐を書く場合は、その条件の目的を理解してifを分けるべきか、if-elif-elseを使うべきか判断しましょう。
age = int(input("年齢を入力してください: "))
if age < 6:
price = 0
category = "未就学児"
elif age < 12:
price = 500
category = "小学生"
elif age < 18:
price = 800
category = "中高生"
elif age < 65:
price = 1200
category = "一般"
else:
price = 800
category = "シニア"
print("区分: {}".format(category))
print("料金: {}円".format(price))
このプログラムは、年齢に応じて適切な料金区分を判定します。elifを使うことで、複雑な年齢区分をシンプルに表現できています。
シンプルな条件分岐(if-elseで変数に値を代入するだけ)の場合、三項演算子を使うと1行で書けます。
# 通常のif-else文
temperature = 28
if temperature >= 25:
message = "暑いです"
else:
message = "涼しいです"
print(message)
これを三項演算子で書くと以下のようにシンプルに書くことができます。
# 三項演算子
temperature = 28
message = "暑いです" if temperature >= 25 else "涼しいです"
print(message)
変数 = True時の値 if 条件式 else False時の値
読み方のコツ:
「もし条件が成り立つなら左の値、そうでなければ右の値を変数に入れる」と読みます。
# 偶数か奇数かを判定
number = 7
result = "偶数" if number % 2 == 0 else "奇数"
print(result) # 奇数
# 合否判定
score = 75
result = "合格" if score >= 60 else "不合格"
print(result) # 合格
# 在庫チェック
stock = 0
status = "在庫あり" if stock > 0 else "在庫切れ"
print(status) # 在庫切れ
三項演算子は便利ですが、使いすぎると読みにくくなります。以下の基準で使い分けましょう。
三項演算子が適している場合:
通常のif-else文を使うべき場合:
# 良い例:シンプルで読みやすい
discount = 0.1 if is_member else 0
# 悪い例:複雑すぎて読みにくい
price = 1000 if (age >= 18 and has_ticket) or is_vip else 500 if age >= 12 else 0
条件分岐の中に、さらに条件分岐を入れることができます。これを「ネスト(入れ子)」と呼びます。
age = 25
has_license = True
if age >= 18:
# 成人の場合、さらに免許の有無をチェック
if has_license:
print("運転できます")
else:
print("免許を取得してください")
else:
# 未成年の場合
print("18歳未満は運転できません")
ネストした条件分岐では、インデントの深さに注意が必要です。
score = 75
attendance_rate = 0.95
if score >= 60:
# 点数が合格ライン以上の場合
if attendance_rate >= 0.8:
# 出席率も十分な場合
print("合格です")
else:
# 出席率が不足している場合
print("出席率が足りません")
else:
# 点数が合格ラインに達していない場合
print("点数が足りません")
インデントの深さ
ネストが深くなりすぎると、コードが読みにくくなります。論理演算子を使って、ネストを浅くする工夫ができます。
# ネストが深い例(読みにくい)
age = 25
has_ticket = True
has_id = True
if age >= 18:
if has_ticket:
if has_id:
print("入場できます")
else:
print("IDが必要です")
else:
print("チケットが必要です")
else:
print("18歳未満は入場できません")
# 論理演算子を使って改善(読みやすい)
age = 25
has_ticket = True
has_id = True
if age < 18:
print("18歳未満は入場できません")
elif not has_ticket:
print("チケットが必要です")
elif not has_id:
print("IDが必要です")
else:
print("入場できます")
2つ目の例の方が、条件を順番にチェックしているのがわかりやすいですね。
total_price = 8000
is_member = True
is_remote_area = False
shipping_fee = 0
if total_price >= 10000:
# 1万円以上は送料無料
shipping_fee = 0
else:
# 1万円未満の場合
if is_member:
# 会員の場合
if is_remote_area:
shipping_fee = 500 # 離島は500円
else:
shipping_fee = 300 # 通常は300円
else:
# 非会員の場合
if is_remote_area:
shipping_fee = 800 # 離島は800円
else:
shipping_fee = 500 # 通常は500円
print("送料: {}円".format(shipping_fee))
複雑な条件は、いくつかの変数に分けると読みやすくなります。
# 複雑な条件をそのまま書いた例(読みにくい)
age = 25
income = 3500000
credit_score = 720
if (age >= 20 and age <= 65) and income >= 3000000 and credit_score >= 700:
print("ローンの審査が通りました")
else:
print("審査基準を満たしていません")
# 条件を変数に分けた例(読みやすい)
age = 25
income = 3500000
credit_score = 720
# 各条件を変数に分ける
is_valid_age = (age >= 20 and age <= 65)
has_sufficient_income = (income >= 3000000)
has_good_credit = (credit_score >= 700)
# すべての条件を満たしているかチェック
if is_valid_age and has_sufficient_income and has_good_credit:
print("ローンの審査が通りました")
else:
print("審査基準を満たしていません")
条件を分けることで、どの条件を満たしていないのかを具体的に伝えることもできます。
age = 70
income = 3500000
credit_score = 720
is_valid_age = (age >= 20 and age <= 65)
has_sufficient_income = (income >= 3000000)
has_good_credit = (credit_score >= 700)
if not is_valid_age:
print("年齢が範囲外です(20-65歳)")
elif not has_sufficient_income:
print("年収が基準に達していません(300万円以上)")
elif not has_good_credit:
print("信用スコアが基準に達していません(700以上)")
else:
print("ローンの審査が通りました")
以下の要件を満たすプログラムを作成してください。
要件
temperatureに気温(例: 32)を代入する期待する出力例
猛暑日です
現在の気温: 32度
ヒント
以下の要件を満たすプログラムを作成してください。
要件
priceに商品価格(例: 1500)を代入するis_memberに会員かどうか(例: True)を代入するdiscount_rateに代入する(三項演算子を使用)final_priceに代入する期待する出力例
元の価格: 1500円
割引率: 10%
割引後: 1350円
ヒント
値1 if 条件 else 値2price * (1 - discount_rate)で計算できますdiscount_rate * 100以下の要件を満たすプログラムを作成してください。
要件
ageに年齢(例: 22)を代入するis_studentに学生かどうか(例: True)を代入するday_of_weekに曜日(例: "土曜日")を代入する期待する出力例
料金: 1000円
ヒント
day_of_week != "土曜日" and day_of_week != "日曜日"以下の要件を満たすプログラムを作成してください。
要件
weightに格納するheightに格納する期待する出力例
体重(kg)を入力してください: 68
身長(cm)を入力してください: 170
BMI: 23.5
判定: 普通体重
ヒント
height_m = height / 100bmi = weight / (height_m ** 2)"".format(bmi)この教材では、以下の内容を学習しました
値1 if 条件 else 値2の形式次の教材では、繰り返し処理(ループ)について学習します。これまで学んだ条件分岐とループを組み合わせることで、より高度なプログラムが作れるようになります。演習問題をしっかり解いて、条件分岐をマスターしましょう。