Python条件语句不符合预期如何修复?(PyCharm环境)
修复Python条件语句的逻辑错误
你的问题出在布尔表达式的逻辑写法错误,Python中or会分别判断每个独立的表达式,而非你预期的连续比较逻辑。
错误原因分析
- 第一段代码的
if studentStatus == "UG" or "G" or "DL",实际执行逻辑是:(studentStatus == "UG") or ("G") or ("DL")。非空字符串"G"、"DL"在布尔判断中永远为True,所以无论输入什么内容,这个条件都会成立,else分支永远不会触发。 - 第二段代码的
if studentStatus != "UG" or "G" or "DL",同理,"G"、"DL"始终为True,导致条件永远成立,哪怕输入正确的UG、G、DL,也会触发错误提示。
两种修复方案
方案1:明确每个比较表达式
把每个状态都和studentStatus单独做比较,用or连接:
studentStatus = str(input("Are you an undergrad (UG), grad (G), or distance learner (DL) student?\n")) if studentStatus == "UG" or studentStatus == "G" or studentStatus == "DL": homework = float(input("How many points did you get for your homework?\n")) homework = (homework / 800) * 100 quiz = float(input("How many points did you get for your quizzes?\n")) quiz = (quiz / 400) * 100 midterm = float(input("How many points did you get for your midterm exam?\n")) midterm = (midterm / 150) * 100 final = float(input("How many points did you get for your final exam?\n")) final = (final / 200) * 100 print(f"Homework: {homework:2.1f}%") print(f"Quiz: {quiz:2.1f}%") print(f"Midterm: {midterm:2.1f}%") print(f"Final: {final:2.1f}%") else: print("Error. Student status must be UG, G, or DL.")
方案2:用in运算符(更简洁)
把允许的状态放在一个列表里,用in判断输入是否在合法范围内:
studentStatus = str(input("Are you an undergrad (UG), grad (G), or distance learner (DL) student?\n")) valid_statuses = ["UG", "G", "DL"] if studentStatus in valid_statuses: homework = float(input("How many points did you get for your homework?\n")) homework = (homework / 800) * 100 quiz = float(input("How many points did you get for your quizzes?\n")) quiz = (quiz / 400) * 100 midterm = float(input("How many points did you get for your midterm exam?\n")) midterm = (midterm / 150) * 100 final = float(input("How many points did you get for your final exam?\n")) final = (final / 200) * 100 print(f"Homework: {homework:2.1f}%") print(f"Quiz: {quiz:2.1f}%") print(f"Midterm: {midterm:2.1f}%") print(f"Final: {final:2.1f}%") else: print("Error. Student status must be UG, G, or DL.")
如果要保留"错误提示优先"的写法,只需把条件改成studentStatus not in valid_statuses:
studentStatus = str(input("Are you an undergrad (UG), grad (G), or distance learner (DL) student?\n")) valid_statuses = ["UG", "G", "DL"] if studentStatus not in valid_statuses: print("Error. Student status must be UG, G, or DL.") else: homework = float(input("How many points did you get for your homework?\n")) homework = (homework / 800) * 100 quiz = float(input("How many points did you get for your quizzes?\n")) quiz = (quiz / 400) * 100 midterm = float(input("How many points did you get for your midterm exam?\n")) midterm = (midterm / 150) * 100 final = float(input("How many points did you get for your final exam?\n")) final = (final / 200) * 100 print(f"Homework: {homework:2.1f}%") print(f"Quiz: {quiz:2.1f}%") print(f"Midterm: {midterm:2.1f}%") print(f"Final: {final:2.1f}%")
内容的提问来源于stack exchange,提问作者bubz
相关产品推荐
相关产品推荐

