Python选课计费代码报错:输入english和science提示math未定义
问题排查与修复:选课计费代码中的"变量未定义"错误
咱们先拆解下你遇到的问题:输入english和science时程序报错math is not defined,核心原因有两个:
1. 变量未提前初始化
你的代码里,只有当某个科目被匹配到时才会创建对应的变量(比如eng = 100),没被选中的科目(比如math、stem)根本没被定义过。当你最后尝试把eng + sci + math + stem相加时,Python找不到未定义的变量,自然就抛出错误了。
2. 条件判断逻辑混乱
你的elif分支是互斥的——比如第一个elif x is not "english"会直接跳过后面所有判断:只要当前科目不是english,就会执行eng = 0,science、stem、math的判断根本不会被触发。另外,用is比较字符串是不规范的,应该用==来比较值。
修复后的优化代码
print("Choose two subjects") print("English $100") print("Math $75") print("Science $125") print("Stem $200") # 用字典存储科目与对应价格,同时初始化总价为0 subject_prices = { "english": 100, "math": 75, "science": 125, "stem": 200 } total_cost = 0 # 读取输入并只取前两个科目(符合"选两个"的需求) selected = input("Choose two subjects: ").split()[:2] for subj in selected: subj_lower = subj.lower() # 检查科目是否有效,匹配"科目不匹配则未定义"的规则 if subj_lower in subject_prices: total_cost += subject_prices[subj_lower] else: print(f"Warning: '{subj}' is not a valid subject, price undefined") print(f"Total cost: ${total_cost}")
关键改动说明
- 提前初始化容器:用字典统一管理科目价格,同时初始化总价变量,彻底避免"变量未定义"问题。
- 优化判断逻辑:每个科目单独做有效性检查,不会出现互斥分支导致的逻辑遗漏。
- 贴合需求的输入处理:自动截取前两个输入,严格对应"选两个科目"的任务要求。
- 明确的错误提示:遇到无效科目时给出清晰提示,符合"科目不匹配则未定义"的规则。
如果你偏好保留原有的变量写法,也可以这样改:
print("Choose two subjects") print("English $100") print("Math $75") print("Science $125") print("Stem $200") # 提前初始化所有科目变量为0,确保变量始终存在 eng = 0 math = 0 sci = 0 stem = 0 a = input("Choose two subjects: ").split()[:2] for x in a: x = x.lower() if x == "english": eng = 100 elif x == "math": math = 75 elif x == "science": sci = 125 elif x == "stem": stem = 200 else: print(f"Subject '{x}' is undefined") print(f"Total cost: ${eng + math + sci + stem}")
这个版本提前把所有科目变量初始化为0,即使没选某个科目,变量也存在,同时修正了elif的顺序,让每个科目判断都能被执行到。
内容的提问来源于stack exchange,提问作者Dev Patel
相关产品推荐
相关产品推荐

