Python中如何捕获无效输入并存储至列表,实现自定义提示功能?
解决猜数字游戏中的无效输入记录与提示问题
嘿,我明白你的需求了!你想在猜数字游戏里把用户输入的非数字内容存起来,并且显示“绝对不是[输入文本]”的提示,但当前代码的逻辑有几个小问题导致实现不了。我来帮你修正一下:
问题出在哪?
- 你的
try-except块放在了外层循环,当用户输入无效内容时,guessedNumber还是上一次的有效数字,所以你append到列表里的不是用户这次输入的无效文本。 - 那个
elif type(guessedNumber) is not int的判断永远不会触发——因为如果输入能转成整数,guessedNumber就是int类型;如果转失败,代码直接进入except块,根本不会走到这个判断里。
修正后的完整代码
import os import pyfiglet # 初始化必要变量(可根据需求调整,比如把realNumber改成随机生成) realNumber = 42 tries = 0 guessedNumbers = [] def checkTries(): # 这里可以添加尝试次数限制的逻辑,比如超过10次提示用户 pass def playAgain(): # 这里可以添加询问是否再玩一次的逻辑 pass while True: os.system("clear") print(pyfiglet.figlet_format("Guess the Number!", font="big")) print("The number is:") # 遍历所有历史尝试,区分有效/无效输入显示提示 for x in guessedNumbers: if isinstance(x, int): if x < realNumber: print(f"Higher than {x}") elif x > realNumber: print(f"Lower than {x}") else: # 非整数即为无效输入,显示对应提示 print(f"Definitely not {x}") # 内层处理输入,捕获无效输入 try: user_input = input("The number is... ") guessedNumber = int(user_input) tries += 1 checkTries() guessedNumbers.append(guessedNumber) # 判断是否猜对 if guessedNumber == realNumber: os.system("clear") print(pyfiglet.figlet_format("You won!", font="big")) if tries == 1: print("You got it in the first try! What a lucky person!") else: print(f"Way to go! You got it in {tries} tries!") break except ValueError: # 捕获无效输入,记录原始字符串并提示 tries += 1 checkTries() guessedNumbers.append(user_input) print(f"\nDefinitely not {user_input}! Try again.") input("Press Enter to continue...")
关键修改点解释
- 内层
try-except处理输入:这样能拿到用户输入的原始字符串user_input,不管转换是否成功都能准确记录。 - 区分存储类型:有效输入转成int存入列表,无效输入直接存原始字符串,方便后续判断显示。
- 前置提示逻辑:把历史尝试的提示显示放在每次输入前,用户能立刻看到上一次输入的反馈,包括无效内容的提示。
- 即时反馈无效输入:捕获到无效输入时,直接给出提示,让用户明确知道输入不合法。
现在测试一下,比如输入“abc”,代码会把“abc”存到guessedNumbers里,并且显示“Definitely not abc”,完全符合你的需求!
内容的提问来源于stack exchange,提问作者Manu1Volta
相关产品推荐
相关产品推荐

