'<' 两种情况之间不支持 - 猜数字游戏



我正在尝试用Python为学校项目创建一个猜数字游戏。我已经制作了一个基本游戏,可以很好地工作,但我想添加一些异常处理,以防用户输入错误的内容。例如,这是我代码的一部分:

def Normal_Guess():
number = round(random.uniform(0.0, 100.0),2)
guess = ""
while guess != number:
try:
guess = float(input("Please guess a number between 0 and 100: "))
except ValueError or TypeError:
print ("That isn't even a number!")
if guess < number and guess >= 0:
print ("You need to guess higher!")
elif guess > number and guess <= 100:
print ("You need to guess lower!")
elif guess == number:
print("Congratulations! You guessed the number!")
elif guess < 0 or guess > 100: 
print ("The number you guessed is not between 0 and 100")
else: 
print("That isn't even a number!")
New_Game()

当用户输入浮点数或整数值作为"猜测"时,这工作正常,如果用户一开始输入的数字之外的任何内容,我拥有的 Try-Except 子句似乎可以捕获,但程序似乎也继续"if"语句。我收到一个TypeError,说"'str'和'float'的实例之间不支持'<'"。

我尝试在 Try-Except 子句中包含整个循环,但这不起作用。我不知道我做错了什么。任何帮助都非常感谢。

首先,您捕获异常的方式是无效的。表达式ValueError or TypeError的值总是ValueError,因为这就是短路与两个非False参数的工作方式。要使这两种类型的错误都触发块,请使用tuple,例如(ValueError, TypeError)

问题是,即使代码中捕获了异常,它也会继续到if块。您有四个简单的选项可以避免这种情况:

  1. except块中使用continue语句告诉循环继续前进,而不处理以下if结构:

    尝试: guess = float(input("請猜一個 0 到 100 之間的數字:")) 除了(ValueError, TypeError): 打印("这甚至不是一个数字!继续

    这可能是四个选项中最干净和最简单的一个。

  2. 不要使用except块来响应错误。相反,依靠猜测的价值仍然""的事实。为此,您必须在循环的每次迭代中预先初始化guess,而不是在循环外一次:

    而猜测!=数字:猜测 =">尝试: guess = float(input("請猜一個 0 到 100 之間的數字:")) 除了(ValueError, TypeError):如果猜测则通过 == ": 打印("这甚至不是一个数字! Elif猜测<数字并猜测>= 0: ...

    就个人而言,我不喜欢这种方法,因为它需要在每个循环中进行初始化。这还不错,只是不如选项 #1 干净。

    此选项的变体是直接检查guess是否是str的实例。然后,您可以将其初始化为用户输入,使转换操作更清晰:

    而猜测!=数字:guess = input("请猜一个介于 0 和 100 之间的数字:")try:猜测 = 浮点数(猜测) 除了(ValueError, TypeError):如果isinstance(guess, str) 则通过: 打印("这甚至不是一个数字! Elif猜测<数字并猜测>= 0: ...
  3. 使用else子句,该子句是try块的可能元素之一。仅当未发生异常时,才会执行此子句:

    尝试: guess = float(input("請猜一個 0 到 100 之間的數字:")) 除了(ValueError, TypeError): 打印("这甚至不是一个数字!否则:如果猜<数字并猜测>= 0:...

    虽然此选项会创建额外的缩进层,但对于普通continue不起作用的情况,值得记住。当您需要在分支之前对错误和非错误情况进行其他处理时,有时会发生这种情况。

  4. 将整个if块放入try块中。这样,只有在没有错误的情况下才会执行。这是我最不喜欢的选项,因为我希望我的try块尽可能精简,以避免捕获我不打算的异常。在 Python 中,try的性能杀手比 Java 等语言要小,所以对于你的简单情况,这仍然是一个选择:

    尝试: guess = float(input("請猜一個 0 到 100 之間的數字:"))如果猜<数字并猜测>= 0:... 除了(ValueError, TypeError): 打印("这甚至不是一个数字!

尝试使用 else 语句。

您的 except 捕获打印,但让脚本继续运行。 即使捕获被击中,它也将继续所有 if 语句。您要做的是在命中 except 时跳过函数的主逻辑。使用 try-catch-else-finally 块的ELSE子句。

import random
def Normal_Guess():
number = round(random.uniform(0.0, 100.0),2)
guess = ""
while guess != number:
try:
guess = float(input("Please guess a number between 0 and 100: "))
except (ValueError, TypeError):
print ("That isn't even a number!")
else:
if guess < number and guess >= 0:
print ("You need to guess higher!")
elif guess > number and guess <= 100:
print ("You need to guess lower!")
elif guess == number:
print("Congratulations! You guessed the number!")
elif guess < 0 or guess > 100:
print ("The number you guessed is not between 0 and 100")
else:
print("That isn't even a number!")
Normal_Guess()

最新更新