Python elif文とは?複数の条件分岐を書く基本
Python elif文の基本的な使い方から応用例まで初心者向けに解説。複数の条件分岐、if-elif-else文の構造、実践的な活用法を詳しく紹介。
Python elif文とは?複数の条件分岐を書く基本
みなさん、Pythonで複数の条件をチェックしたい時、困ったことありませんか?
「if文だけだと複雑になっちゃう」 「たくさんの条件を効率的に書きたい」 「elif文って聞いたことあるけど、使い方がよくわからない」
こんな悩み、よくありますよね。
実は、Pythonにはelif文という便利な機能があります。 これを使えば、複数の条件を順番にチェックして、スッキリしたコードが書けるんです。
この記事では、Python初心者が知っておくべきelif文の基本から実践的な使い方まで、分かりやすく解説します。 複数の条件分岐を効率的に書く方法を、一緒に学んでいきましょう!
elif文って何?
elif文は、Pythonで複数の条件を順番にチェックするための制御構文です。
簡単に言うと、「もしAなら〜、そうでなくてもしBなら〜、そうでなくてもしCなら〜」という処理を書けるんです。
elif文の基本的な役割
まずは、簡単な例から見てみましょう。
# 数値を分類する例def classify_number(number): if number > 0: return "正の数" elif number < 0: return "負の数" else: return "ゼロ"
# テストしてみようtest_numbers = [5, -3, 0, 10, -7]for num in test_numbers: result = classify_number(num) print(f"数値 {num}: {result}")
このコードを実行すると、こんな結果が出ます。
数値 5: 正の数
数値 -3: 負の数
数値 0: ゼロ
数値 10: 正の数
数値 -7: 負の数
とてもシンプルで分かりやすいですね!
elif文がない場合と比較してみよう
elif文の便利さを実感するために、使わない場合と比較してみましょう。
# elif文を使わない場合(非効率)def classify_number_without_elif(number): if number > 0: return "正の数" if number < 0: return "負の数" if number == 0: return "ゼロ"
この書き方だと、毎回すべての条件をチェックしてしまいます。 効率が悪いですよね。
# ネストしたif文を使う場合(読みにくい)def classify_number_nested(number): if number > 0: return "正の数" else: if number < 0: return "負の数" else: return "ゼロ"
これも動きますが、ネストが深くなって読みにくいです。
やっぱり、elif文を使った方がスッキリしていて理解しやすいですね。
elif文の特徴
elif文には、こんな便利な特徴があります。
順次評価
- 条件を上から順番に評価します
- 最初にTrueになった条件で処理が決まります
効率性
- 条件が満たされた時点で、以降の条件は評価されません
- 無駄な計算を避けられます
可読性
- 複数の条件を並列に書けて読みやすいです
- ネストが深くなりません
拡張性
- 必要に応じて条件を追加しやすいです
- 保守性が高いです
実行順序を確認してみよう
elif文がどのように動作するか、詳しく見てみましょう。
# 実行順序を可視化する例def demonstrate_execution_order(value): print(f"値 {value} の評価:") if value > 10: print(" 条件1 (value > 10): True - この条件で確定") return "大きな数" elif value > 5: print(" 条件1 (value > 10): False") print(" 条件2 (value > 5): True - この条件で確定") return "中程度の数" elif value > 0: print(" 条件1 (value > 10): False") print(" 条件2 (value > 5): False") print(" 条件3 (value > 0): True - この条件で確定") return "小さな正の数" else: print(" 条件1 (value > 10): False") print(" 条件2 (value > 5): False") print(" 条件3 (value > 0): False") print(" else節: この条件で確定") return "ゼロまたは負の数"
# 実行順序のテストtest_values = [15, 7, 3, -2]for val in test_values: result = demonstrate_execution_order(val) print(f" 結果: {result}")
このように、条件を上から順番にチェックして、最初にTrueになった時点で決まるんです。
基本構文
elif文の基本的な書き方はこちらです。
if 条件1: 処理1elif 条件2: 処理2elif 条件3: 処理3else: その他の処理
重要なポイント
- if文は必須(最初に1つ)
- elif文は任意(0個以上)
- else文は任意(0個または1つ、最後に配置)
- 上から順番に条件を評価
- 最初にTrueになった条件のブロックのみ実行
これで、elif文の基本概念は理解できましたね!
if-elif-else文の構造
if-elif-else文には、いくつかのパターンがあります。 それぞれの特徴を見てみましょう。
基本構造のバリエーション
1. if-elif のみ(else なし)
def grade_with_if_elif_only(score): if score >= 90: return "A" elif score >= 80: return "B" elif score >= 70: return "C" elif score >= 60: return "D" # else がないため、60未満の場合は None が返される
この場合、どの条件にも当てはまらない時はNone
が返されます。
2. if-elif-else の完全形
def grade_with_complete_structure(score): if score >= 90: return "A" elif score >= 80: return "B" elif score >= 70: return "C" elif score >= 60: return "D" else: return "F"
これが一番安全で、すべてのケースをカバーできます。
3. if-else のみ(elif なし)
def simple_pass_fail(score): if score >= 60: return "合格" else: return "不合格"
シンプルな2択の場合は、これで十分ですね。
テストして比較してみよう
実際に動かして、違いを確認してみましょう。
test_scores = [95, 85, 75, 65, 55, 45]
print("1. if-elif のみ(else なし):")for score in test_scores: result = grade_with_if_elif_only(score) print(f" スコア {score}: {result}")
print("2. 完全なif-elif-else構造:")for score in test_scores: result = grade_with_complete_structure(score) print(f" スコア {score}: {result}")
print("3. 単純なif-else構造:")for score in test_scores: result = simple_pass_fail(score) print(f" スコア {score}: {result}")
実行結果はこんな感じです。
1. if-elif のみ(else なし):
スコア 95: A
スコア 85: B
スコア 75: C
スコア 65: D
スコア 55: None
スコア 45: None
2. 完全なif-elif-else構造:
スコア 95: A
スコア 85: B
スコア 75: C
スコア 65: D
スコア 55: F
スコア 45: F
3. 単純なif-else構造:
スコア 95: 合格
スコア 85: 合格
スコア 75: 合格
スコア 65: 合格
スコア 55: 不合格
スコア 45: 不合格
完全な構造の方が、すべてのケースに対応できて安心ですね。
条件の順序がとても重要!
elif文を使う時は、条件の順序がとても重要です。 間違った順序だと、期待通りに動かないことがあります。
正しい順序の例
def age_category_correct_order(age): if age < 0: return "無効な年齢" elif age < 13: return "子供" elif age < 20: return "ティーンエイジャー" elif age < 60: return "大人" else: return "シニア"
間違った順序の例(問題がある)
def age_category_wrong_order(age): if age < 60: # この条件が広すぎて、以下の条件に到達しない return "大人" elif age < 20: # ここには到達しない return "ティーンエイジャー" elif age < 13: # ここにも到達しない return "子供" else: return "シニア"
比較してみましょう。
test_ages = [5, 15, 25, 65]
print("正しい順序:")for age in test_ages: result = age_category_correct_order(age) print(f" 年齢 {age}: {result}")
print("間違った順序(問題あり):")for age in test_ages: result = age_category_wrong_order(age) print(f" 年齢 {age}: {result}")
実行結果はこちらです。
正しい順序:
年齢 5: 子供
年齢 15: ティーンエイジャー
年齢 25: 大人
年齢 65: シニア
間違った順序(問題あり):
年齢 5: 大人
年齢 15: 大人
年齢 25: 大人
年齢 65: シニア
間違った順序だと、5歳や15歳も「大人」になってしまいます。 これは明らかにおかしいですよね。
ルール: より具体的で狭い条件を先に書く
条件は、狭い範囲から広い範囲の順番で書きましょう。
ベストプラクティス
良いelif文を書くためのコツをまとめました。
条件の順序
- より具体的で狭い条件を先に書く
age < 13
をage < 60
より先に書く
可読性
- 条件式を分かりやすく書く
- 複雑な条件は変数に代入してから使用
完全性
- 可能な限りelse文を含めて全ケースをカバー
- 予期しない入力に対する対応を含める
保守性
- 条件の追加・変更がしやすい構造にする
- マジックナンバーを定数として定義
ベストプラクティスを適用した例
定数を使って、より保守しやすいコードにしてみましょう。
# 定数の定義GRADE_A_THRESHOLD = 90GRADE_B_THRESHOLD = 80GRADE_C_THRESHOLD = 70GRADE_D_THRESHOLD = 60
def improved_grade_calculation(score): # 入力値の検証 if score < 0 or score > 100: return "無効なスコア" # 明確な条件での分岐 if score >= GRADE_A_THRESHOLD: return "A (優秀)" elif score >= GRADE_B_THRESHOLD: return "B (良好)" elif score >= GRADE_C_THRESHOLD: return "C (普通)" elif score >= GRADE_D_THRESHOLD: return "D (可)" else: return "F (不可)"
# テストtest_scores = [105, 95, 85, 75, 65, 55, -5]print("改良された成績計算:")for score in test_scores: result = improved_grade_calculation(score) print(f" スコア {score}: {result}")
実行結果はこちらです。
改良された成績計算:
スコア 105: 無効なスコア
スコア 95: A (優秀)
スコア 85: B (良好)
スコア 75: C (普通)
スコア 65: D (可)
スコア 55: F (不可)
スコア -5: 無効なスコア
エラーチェックも含めて、完璧ですね!
実用的な使用例
それでは、elif文の実際の活用例を見てみましょう。
成績判定システム
学校の成績判定システムを作ってみます。
# 基本的な成績判定def simple_grade_system(score): if score >= 90: return {"grade": "A", "description": "優秀", "gpa": 4.0} elif score >= 80: return {"grade": "B", "description": "良好", "gpa": 3.0} elif score >= 70: return {"grade": "C", "description": "普通", "gpa": 2.0} elif score >= 60: return {"grade": "D", "description": "可", "gpa": 1.0} else: return {"grade": "F", "description": "不可", "gpa": 0.0}
# 成績判定のテストtest_scores = [95, 87, 76, 63, 58, 42]
print("基本的な成績判定:")for score in test_scores: result = simple_grade_system(score) print(f" {score}点: {result['grade']} ({result['description']}) - GPA: {result['gpa']}")
実行結果はこちらです。
基本的な成績判定:
95点: A (優秀) - GPA: 4.0
87点: B (良好) - GPA: 3.0
76点: C (普通) - GPA: 2.0
63点: D (可) - GPA: 1.0
58点: F (不可) - GPA: 0.0
42点: F (不可) - GPA: 0.0
より詳細な成績判定
A+、A、A-のように、より細かい成績判定も作れます。
def calculate_detailed_grade(score): if score >= 97: return 'A+' elif score >= 93: return 'A' elif score >= 90: return 'A-' elif score >= 87: return 'B+' elif score >= 83: return 'B' elif score >= 80: return 'B-' elif score >= 77: return 'C+' elif score >= 73: return 'C' elif score >= 70: return 'C-' elif score >= 67: return 'D+' elif score >= 63: return 'D' elif score >= 60: return 'D-' else: return 'F'
# 詳細成績のテストtest_scores = [98, 95, 88, 84, 78, 74, 68, 64, 55]print("詳細な成績判定:")for score in test_scores: grade = calculate_detailed_grade(score) print(f" {score}点: {grade}")
実行結果はこちらです。
詳細な成績判定:
98点: A+
95点: A
88点: B+
84点: B
78点: C+
74点: C
68点: D+
64点: D
55点: F
条件付き成績判定
出席率や課題提出率も考慮した、より複雑な成績判定システムです。
def conditional_grading(scores, attendance_rate, assignment_completion): base_average = sum(scores) / len(scores) if scores else 0 # 出席率による調整 if attendance_rate >= 95: attendance_bonus = 5 elif attendance_rate >= 90: attendance_bonus = 3 elif attendance_rate >= 80: attendance_bonus = 1 elif attendance_rate >= 70: attendance_bonus = 0 else: attendance_bonus = -5 # ペナルティ # 課題提出率による調整 if assignment_completion >= 100: assignment_bonus = 5 elif assignment_completion >= 90: assignment_bonus = 3 elif assignment_completion >= 80: assignment_bonus = 1 elif assignment_completion >= 70: assignment_bonus = 0 else: assignment_bonus = -3 # ペナルティ # 最終スコア計算 final_score = base_average + attendance_bonus + assignment_bonus final_score = max(0, min(100, final_score)) # 0-100の範囲に制限 # 最終成績判定 if final_score >= 90: final_grade = "A" elif final_score >= 80: final_grade = "B" elif final_score >= 70: final_grade = "C" elif final_score >= 60: final_grade = "D" else: final_grade = "F" return { "base_average": base_average, "attendance_bonus": attendance_bonus, "assignment_bonus": assignment_bonus, "final_score": final_score, "final_grade": final_grade }
# 条件付き成績判定のテストstudent_cases = [ { "name": "優秀な学生", "scores": [88, 92, 85, 90], "attendance": 98, "assignments": 100 }, { "name": "普通の学生", "scores": [75, 78, 72, 80], "attendance": 85, "assignments": 85 }, { "name": "問題のある学生", "scores": [65, 70, 68, 72], "attendance": 60, "assignments": 50 }]
print("条件付き成績判定:")for case in student_cases: result = conditional_grading( case["scores"], case["attendance"], case["assignments"] ) print(f"{case['name']}:") print(f" テスト平均: {result['base_average']:.1f}点") print(f" 出席ボーナス: {result['attendance_bonus']:+d}点") print(f" 課題ボーナス: {result['assignment_bonus']:+d}点") print(f" 最終スコア: {result['final_score']:.1f}点") print(f" 最終成績: {result['final_grade']}")
実行結果はこちらです。
条件付き成績判定:
優秀な学生:
テスト平均: 88.8点
出席ボーナス: +5点
課題ボーナス: +5点
最終スコア: 98.8点
最終成績: A
普通の学生:
テスト平均: 76.2点
出席ボーナス: +1点
課題ボーナス: +1点
最終スコア: 78.2点
最終成績: C
問題のある学生:
テスト平均: 68.8点
出席ボーナス: -5点
課題ボーナス: -3点
最終スコア: 60.8点
最終成績: D
複雑な条件でも、elif文を使えば整理して書けますね!
ユーザー権限管理
システムのユーザー権限管理の例も見てみましょう。
def check_access_permission(user_role, action): # 役割別の権限レベル定義 if user_role == "guest": user_level = 0 elif user_role == "viewer": user_level = 1 elif user_role == "editor": user_level = 2 elif user_role == "moderator": user_level = 3 elif user_role == "admin": user_level = 4 elif user_role == "superadmin": user_level = 5 else: user_level = 0 # 未知の役割は最低権限 # アクション別の必要権限レベル action_permissions = { "read": 1, # 読み取り "write": 2, # 書き込み "delete": 3, # 削除 "admin": 4, # 管理者操作 "system": 5 # システム操作 } required_level = action_permissions.get(action, 999) # 未知のアクションは最高権限要求 if user_level >= required_level: return True, f"権限あり (レベル {user_level} >= {required_level})" else: return False, f"権限不足 (レベル {user_level} < {required_level})"
# 権限チェックのテストtest_cases = [ ("admin", "read"), ("editor", "write"), ("viewer", "delete"), ("guest", "read"), ("moderator", "admin"), ("superadmin", "system"), ("unknown_role", "read")]
print("権限チェック結果:")for role, action in test_cases: allowed, message = check_access_permission(role, action) status = "許可" if allowed else "拒否" print(f" {role} → {action}: {status} ({message})")
実行結果はこちらです。
権限チェック結果:
admin → read: 許可 (権限あり (レベル 4 >= 1))
editor → write: 許可 (権限あり (レベル 2 >= 2))
viewer → delete: 拒否 (権限不足 (レベル 1 < 3))
guest → read: 拒否 (権限不足 (レベル 0 < 1))
moderator → admin: 拒否 (権限不足 (レベル 3 < 4))
superadmin → system: 許可 (権限あり (レベル 5 >= 5))
unknown_role → read: 拒否 (権限不足 (レベル 0 < 1))
メニューシステム
アプリケーションのメニューシステムも作れます。
def handle_menu_choice(choice): if choice == "1" or choice.lower() == "ファイル": return "ファイル操作メニューを開きました" elif choice == "2" or choice.lower() == "データ": return "データ処理メニューを開きました" elif choice == "3" or choice.lower() == "設定": return "設定メニューを開きました" elif choice == "4" or choice.lower() == "ヘルプ": return "ヘルプを表示しました" elif choice == "5" or choice.lower() == "終了": return "アプリケーションを終了します" else: return "無効な選択です。1-5 または対応する名前を入力してください。"
# メニューシステムのテストdemo_inputs = ["1", "ヘルプ", "無効", "終了"]
print("メニューシステムのデモ:")print("1. ファイル操作")print("2. データ処理") print("3. 設定")print("4. ヘルプ")print("5. 終了")
for demo_input in demo_inputs: result = handle_menu_choice(demo_input) print(f"選択「{demo_input}」: {result}")
実行結果はこちらです。
メニューシステムのデモ:
1. ファイル操作
2. データ処理
3. 設定
4. ヘルプ
5. 終了
選択「1」: ファイル操作メニューを開きました
選択「ヘルプ」: ヘルプを表示しました
選択「無効」: 無効な選択です。1-5 または対応する名前を入力してください。
選択「終了」: アプリケーションを終了します
数字でも文字でも選択できて、親切ですね!
まとめ
Python のelif文について、基本概念から実践的な活用法まで詳しく解説しました。
重要なポイントをおさらい
elif文の基本
- elif文は複数の条件を効率的に処理する制御構文
- 上から順番に条件を評価し、最初にTrueになった条件で実行
- 条件の順序がとても重要(具体的で狭い条件を先に書く)
構造のパターン
- if-elif-else構造で全ケースをカバーすることが重要
- 必要に応じてelif文の数は調整可能
- else文で予期しない場合にも対応
実用的な活用場面
- 成績判定システム
- ユーザー権限管理
- メニューシステム
- その他の多段階判定が必要な場面
ベストプラクティス
- 保守性と可読性を考慮した構造設計
- 定数を使って分かりやすいコード
- エラーチェックも含めた完全な処理
elif文を適切に使うことで、複雑な条件分岐を効率的かつ読みやすく実装できます。
まずは簡単な例から始めて、徐々に複雑な条件分岐に挑戦してみてください。 様々な実用例を通じて、Pythonプログラミングのスキルを向上させていきましょう!