如何优化含大量if条件的成绩判定Python程序?
精简代码并提升效率的方案
优化后的完整代码
def check_subject_mark(subject_name, mark): if mark > 100.0: print(f"Invalid input for {subject_name}") return False elif mark >= 35.0: print(f"Pass in {subject_name}") return True else: print(f"Fail in {subject_name}") return False while True: subjects = ["Tamil", "English", "Chemistry", "Physics", "Non-major", "Python"] marks = [] valid_input = True # 批量处理科目输入与验证 for subject in subjects: try: mark = float(input(f"Enter your mark in {subject}: ")) marks.append(mark) # 检查当前科目分数并更新输入有效性 if not check_subject_mark(subject, mark): valid_input = False except ValueError: print(f"Invalid input for {subject} - please enter a number") valid_input = False break # 仅当所有输入有效时计算总分与百分比 if valid_input: total = sum(marks) percentage = (total / 600) * 100 print(f"Your total: {total}") print(f"Your percentage: {percentage:.2f}") else: print("Check your marks") # 处理后续计算的输入验证 while True: next_calculation = input("Do you want to proceed with next calculation? (yes/no) ").strip().lower() if next_calculation == "no": exit() elif next_calculation == "yes": break else: print("Invalid input - please enter 'yes' or 'no'")
核心优化点说明
封装重复逻辑为函数
把每个科目的分数检查、结果输出逻辑封装到check_subject_mark函数中,彻底消除原代码中重复6次的if判断块,后续新增科目只需修改subjects列表,无需重复编写判断逻辑,代码可维护性大幅提升。批量处理科目数据
用列表存储所有科目名称,通过循环完成输入和检查,替代原代码中重复的单个变量输入语句,减少冗余代码的同时,扩展性更强。统一输入有效性管理
用valid_input变量跟踪所有输入的合法性,一旦某个科目输入无效(非数字或分数超过100),直接标记为无效状态,后续跳过总分计算,避免原代码中重复的多变量判断。修复逻辑错误
原代码中next_calculation != ("yes" or "no")的写法存在逻辑错误("yes" or "no"的结果为"yes"),优化后通过循环强制用户输入有效选项,确保逻辑正确性。增强鲁棒性
新增非数字输入的异常捕获,避免用户输入非数字内容时程序崩溃,提升了程序的容错能力。提升代码可读性
使用f-string格式化输出,变量命名更清晰(如subjects、marks替代单个字母变量),代码结构更直观。
内容的提问来源于stack exchange,提问作者Kavin Nath
相关产品推荐
相关产品推荐

