如何修复 Python 中多个 elif 语句仅第一个生效的问题

本文详解为何嵌套在 `elif` 中的条件判断失效,并提供结构清晰、逻辑严谨的分数等级判定正确写法,避免因条件重叠导致后续分支被跳过。

问题根源在于:elif 是互斥的链式判断,一旦某个 elif 条件为 True,后续所有 elif 和 else 将被完全跳过。在原代码中:

if fscore < 0.60:
    print('F')
elif fscore >= 0.60:   # ✅ 若 fscore=0.75,此条件为 True → 进入该分支
    if fscore < 0.70:  # ❌ 但 0.75 < 0.70 为 False,内部不执行,且不再检查后续 elif!
        print('D')
elif fscore >= 0.70:   # ⚠️ 永远不会执行!因为上一个 elif 已匹配(>=0.60 对所有 ≥0.60 的数都成立)
    ...

fscore >= 0.60 覆盖了 [0.60, +∞) 全区间,因此只要分数 ≥0.60

,程序就进入第二个 elif 块,而其内部的嵌套 if 只检查 0.60 ≤ fscore = 0.70 等根本不会被评估。

✅ 正确做法是:每个 elif 应定义互斥、无重叠的独立区间,无需嵌套 if。推荐使用半开区间(左闭右开)清晰表达:

score = input('Please enter your score: ')
try:
    fscore = float(score)
except ValueError:
    print('Error, please enter a number')
    quit()

if fscore < 0.0 or fscore > 1.0:
    print('Error')  # 超出有效范围
elif fscore < 0.60:
    print('F')
elif fscore < 0.70:  # 隐含 fscore >= 0.60(因前一条件为 False)
    print('D')
elif fscore < 0.80:  # 隐含 fscore >= 0.70
    print('C')
elif fscore < 0.90:  # 隐含 fscore >= 0.80
    print('B')
elif fscore <= 1.00: # 隐含 fscore >= 0.90
    print('A')
else:
    print('Error')  # 理论上不会到达,但保留兜底

? 关键技巧:

  • 利用 elif 的链式特性——每个条件只需判断“上限”,下限由前序 if/elif 的失败自然保证;
  • 显式校验输入范围( 1.0),比依赖 else 更健壮;
  • 使用 ValueError 替代空 except:,避免捕获意外异常;
  • 删除冗余比较(如 >= 0.60),精简逻辑,提升可读性与可靠性。

这样改写后,输入 0.75 将准确输出 'C',所有分数段均能被正确覆盖。