问题描述
我正在尝试制作一个带有用户退出程序选项的猜测游戏,但是我无法使程序的“退出”部分按预期工作。
from random import randint
userGuess = input("Pick a number from 1 to 1000: ")
guess = randint(1,1000)
while userGuess != guess:
try:
userGuess = int(userGuess)
if userGuess > guess:
print("The number you entered is higer than the guess. Try again.\n")
userGuess = int(input("Pick a number from 1 to 1000: "))
elif userGuess < guess:
print("The number you entered is lower than the guess. Try again.\n")
userGuess = int(input("Pick a number from 1 to 1000: "))
else:
print("You guessed it!")
break
except (TypeError,ValueError):
userGuess = str(userGuess)
if userGuess.lower() == 'quit':
print("Quitting....")
break
每当我运行该程序时,如果在游戏开始时键入“ quit”,则退出该程序。但是,如果我在键入quit之前猜出一个数字,程序将按照应有的方式通过if语句,但是当您尝试在默认值之后退出时,“输入的数字太低。请重试”而不是退出程序按预期。
除try-except方法外,我不知道是否还有更好的方法来处理“退出”命令。
解决方法
圣贾格击败了我,问题确实在于,如果先前的输入大于或小于目标数字,则您仅要求再次输入。如果您在至少输入了一次数字之后输入了“ quit”,则userGuess
仍包含先前的数字输入。
您的代码可以重新组织和简化,这应该可以更轻松地避免此类问题:
from random import randint
target = randint(1,1000)
while True:
user_input = input('Enter your guess (between 1 and 1000),or "quit" to quit: ')
if user_input.casefold() == 'quit':
print('Quitting.')
break
try:
user_guess = int(user_input)
except ValueError:
print(f'Invalid input: {user_input}. Please try again.')
continue
if user_guess > target:
print('Your guess is bigger than the number,try again.')
elif user_guess < target:
print('Your guess is smaller than the number,try again.')
else:
print(f'You guessed correctly,the number was {target}')
break
请注意try
子句下的代码量,该数量仅视需要而定。
编辑:在行中
userGuess = int(input("Pick a number from 1 to 1000: "))
首先输入数字时,userGuess是您选择的数字。然后,您尝试输入'quit',但是类型转换整数会抛出错误,因为它不能执行int('quit')
。这导致程序到达except:
部分。但是,由于错误,您没有正确更改userGuess值,它仍然是您输入的最后一个数字。这就是if userGuess.lower() == 'quit':
条件从不评估为True的原因。
一个简单的解决方法是先获取输入,然后再转换为类型转换。
编辑:正如AMC指出的那样,以下部分是错误的。它没有考虑到某些Unicode字符也为 isnumeric 返回True,我错了。您可以参考How can I check if a string represents an int,without using try/except?来了解不使用try / except的方法。
您可以使用 isnumeric 函数来检查输入是整数还是字符串。
user_input = input()
if user_input.isnumeric():
#Do something
else:
#Do something else