Python石头剪刀布代码遇EOFError问题求助
问题分析与解决
问题描述
我是13岁编程初学者,跟着code-bullet的视频入门。写了一个石头剪刀布的Python代码,本地Python Shell能正常运行,但在线代码测试器一直报EOFError,提示问题在if语句第3行。尝试参考别人的方案修复,反而出现其他错误,删了相关代码后还是搞不懂if语句的问题。
原代码:
import random foe = random.randint(1, 3) you = int(input("pick 1-3")) print(you) if you == foe: print("it's a tie") elif you > foe: try: print("checking for special conditions") except: if you == 3 and foe == 1: print("you lose") else: print("you win") finally: print("complete") else: try: print("checking for special conditions") except: if you == 1 and foe == 3: print("you win") else: print("you lose") finally: print("complete")
问题1:EOFError报错原因
在线代码测试器如果没有预先提供输入内容,input()函数会因为读取不到输入而抛出EOFError(文件结束错误)。本地Shell会等待你手动输入,所以没问题,但在线测试器需要你提前指定输入值,或者代码里加输入异常处理。
解决办法:
- 在线测试时,找到测试器的输入配置区域,手动输入1-3的数字再运行;
- 或者给代码加输入异常捕获,比如:
try: you = int(input("pick 1-3: ")) except (EOFError, ValueError): # 读取不到输入或输入不是数字时,随机选一个值 you = random.randint(1, 3) print(f"自动选择:{you}")
问题2:if语句的逻辑错误
你代码里的try-except完全没用——print("checking for special conditions")不会抛出任何异常,所以except块永远不会执行。这就导致:
- 当你选3、对手选1时(本来应该输),代码会执行
elif you>foe里的else分支,输出"you win",逻辑完全反了; - 当你选1、对手选3时(本来应该赢),代码会执行
else里的else分支,输出"you lose",也是错的。
修正后的代码
去掉多余的try-except,直接用逻辑判断处理特殊情况:
import random # 规则:1赢2,2赢3,3赢1(可根据你的设定调整) foe = random.randint(1, 3) try: you = int(input("pick 1-3: ")) except (EOFError, ValueError): you = random.randint(1, 3) print(f"输入无效,自动选择:{you}") print(f"你选了:{you},对手选了:{foe}") if you == foe: print("it's a tie") elif (you == 3 and foe == 1) or (you < foe and not (you ==1 and foe ==3)): print("you lose") else: print("you win") print("complete")
逻辑说明
- 先判断平局;
- 判断输的情况:要么是3 vs 1,要么是普通的你选的数字比对手小(排除1 vs3的特殊赢局);
- 剩下的情况都是赢。
这样逻辑清晰,也解决了在线测试的EOF问题。
内容的提问来源于stack exchange,提问作者ayconn
相关产品推荐
相关产品推荐

