Python哨兵值失效程序提前退出,如何正确设置-1终止循环?
问题根源梳理
- 原循环条件绑定了成绩有效范围,只要输入超出0-100就直接终止循环,自然无法实现只有输入-1才退出的逻辑
- 你尝试写的
while grade_entered != '-1'不生效是因为输入被转成了float类型,数值型的-1和字符串'-1'不可能相等,判断永远不成立 - 原代码中
else和while配对,只有循环正常终止才会执行错误提示,不符合输入无效成绩就立刻提示的要求 - 原逻辑统计的是所有有效成绩的平均分,和需求要求的「及格成绩(>=50分)占有效成绩的比例」不匹配
修改后可运行代码
pass_count = 0 valid_count = 0 print('Enter test scores to average. Enter -1 to Quit:') while True: # 先读输入,不提前转数值,方便判断哨兵值 input_str = input("").strip() # 先判断是不是哨兵值 if input_str == '-1': break # 转成浮点型判断有效性,兼容非数值输入的异常情况 try: grade_entered = float(input_str) except: print('This is not a valid grade!') continue # 判断成绩范围是否有效 if 0 <= grade_entered <= 100: valid_count += 1 # 统计及格人数 if grade_entered >= 50: pass_count +=1 else: print('This is not a valid grade!') continue # 避免无有效成绩时的除零错误 if valid_count == 0: print("No valid grades entered.") else: print(f"You have entered {pass_count} passing grades.") pass_rate = (pass_count / valid_count) * 100 print("{:.1f}% of the valid grades are passing".format(pass_rate))
核心修改说明
- 循环改为
while True,优先判断输入是否为哨兵值-1,匹配则直接跳出循环,保证只有输入-1才会终止程序 - 先以字符串形式读取输入,判断完哨兵值后再转数值,避免类型不匹配导致的哨兵判断失效
- 无效成绩(超范围/非数值)直接提示后用
continue回到循环开头,不会终止程序 - 新增及格成绩统计逻辑,按需求计算及格占比,同时添加了无有效成绩的异常防护
内容的提问来源于stack exchange,提问作者Jonathan Arias-Gomez
相关产品推荐
相关产品推荐

