Python elif文とは?複数の条件分岐を書く基本

Python elif文の基本的な使い方から応用例まで初心者向けに解説。複数の条件分岐、if-elif-else文の構造、実践的な活用法を詳しく紹介。

Learning Next 運営
28 分で読めます

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:
処理1
elif 条件2:
処理2
elif 条件3:
処理3
else:
その他の処理

重要なポイント

  • 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 < 13age < 60より先に書く

可読性

  • 条件式を分かりやすく書く
  • 複雑な条件は変数に代入してから使用

完全性

  • 可能な限りelse文を含めて全ケースをカバー
  • 予期しない入力に対する対応を含める

保守性

  • 条件の追加・変更がしやすい構造にする
  • マジックナンバーを定数として定義

ベストプラクティスを適用した例

定数を使って、より保守しやすいコードにしてみましょう。

# 定数の定義
GRADE_A_THRESHOLD = 90
GRADE_B_THRESHOLD = 80
GRADE_C_THRESHOLD = 70
GRADE_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プログラミングのスキルを向上させていきましょう!

関連記事