PyCharm中inputtimeout循环无法终止问题求助
PyCharm中inputtimeout循环无法终止问题求助
看起来你的递归逻辑里有几个小bug导致程序停不下来,我帮你拆解下问题根源,再给你调整后的代码~
问题出在哪?
- 超时分支的递归传参错误:当触发超时异常时,你调用
ask_question(num_qus),这里传的还是原来的题目数,没有减1!相当于每次超时都重新开始一轮相同题量的出题,永远不会走到终止条件。 - 终止条件位置完全错了:你把
if num_qus == 0: quit()放在了递归调用之后,这行代码永远不会执行——因为递归调用会直接跳转到新的函数执行,后面的代码直接被跳过了。 - 正常答题后的逻辑缺失:在try块里答对题目后,你只减了题目数,但没有继续调用下一题,导致正常答完一道题程序就结束了,反而超时的时候会无限循环,逻辑完全反过来了😂
调整后的代码
我把逻辑重新梳理了下,确保每道题处理完(不管答对还是超时)都正确减少剩余题量,且终止条件放在最前面:
import random from inputimeout import inputimeout, TimeoutOccurred # 先把输入转成int,避免函数里重复转换,也能提前发现输入错误 input("press enter to start") lowest_numb = int(input("lowest number: ")) highish_numb = int(input("highest number: ")) # 变量名改得更直观了点 time_for_qus = int(input("time per question (seconds): ")) total_qus = int(input("How many questions? ")) def ask_question(remaining_qus): # 先检查剩余题量,没题了直接终止 if remaining_qus <= 0: print("\nAll questions finished!") return # 生成乘法题 ran_1 = random.randint(lowest_numb, highish_numb) ran_2 = random.randint(lowest_numb, highish_numb) print(f"\nQuestion {total_qus - remaining_qus + 1}: {ran_1}x{ran_2} = ", end="") try: # 等待用户输入答案 answer = inputimeout(prompt="", timeout=time_for_qus) # 这里可以加个答案正确性判断,比如: # if int(answer) == ran_1 * ran_2: # print("Correct!") # else: # print(f"Wrong! The right answer is {ran_1*ran_2}") except TimeoutOccurred: print("\nTimes up!!!") # 处理完当前题,剩余题量减1,继续下一题 ask_question(remaining_qus - 1) # 启动出题 ask_question(total_qus)
调整说明
- 把输入的数字提前转成
int,减少函数里的重复操作,也能在输入阶段就捕获非数字的错误。 - 函数开头先判断剩余题量,没题了直接
return终止递归,这是最关键的终止逻辑。 - 不管是答对还是超时,处理完当前题目后统一调用下一题,传递
remaining_qus - 1,确保每道题都正确消耗题量。 - 加了题目序号打印,看起来更清晰(这个是可选优化,你可以删掉)。
这样修改后,程序就会严格按照你设置的题目数量出题,完成后自动终止啦~
备注:内容来源于stack exchange,提问作者user29961513
相关产品推荐
相关产品推荐

