“<”不支持案例间数字猜测gam

2024-03-28 11:05:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为一个学校项目创建一个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()

当用户输入一个浮点值或整数值作为“guess”时,这个方法很好地工作,如果用户一开始输入的不是数字,我的Try-Except子句似乎会捕捉到,但是程序似乎也会继续执行“if”语句。我收到一个类型错误,它说“str”和“float”实例之间不支持“<;”。你知道吗

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


Tags: orand用户you游戏numberthat数字
2条回答

首先,捕捉异常的方式是无效的。表达式ValueError or TypeError的值总是ValueError,因为对于两个非False参数,短路就是这样工作的。要获得两种类型的错误来触发块,请使用tuple,如(ValueError, TypeError)。你知道吗

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

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

    try:
        guess = float(input("Please guess a number between 0 and 100: "))
    except (ValueError, TypeError):
        print ("That isn't even a number!")
        continue

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

  2. 不要使用except块来响应错误。相反,依赖于这样一个事实:guess的值仍然是""。要使其工作,您必须在循环的每次迭代中预先初始化guess,而不是在循环外初始化一次:

    while guess != number:
        guess = ""
        try:
            guess = float(input("Please guess a number between 0 and 100: "))
        except (ValueError, TypeError):
            pass
        if guess == "":
            print ("That isn't even a number!")
        elif guess < number and guess >= 0:
            ...
    

    我个人并不喜欢这种方法,因为它需要在每个循环中进行初始化。这还不错,只是没有选项1那么干净。你知道吗

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

    while guess != number:
        guess = input("Please guess a number between 0 and 100: ")
        try:
            guess = float(guess)
        except (ValueError, TypeError):
            pass
        if isinstance(guess, str):
            print ("That isn't even a number!")
        elif guess < number and guess >= 0:
            ...
    
  3. 使用else子句,它是try块的可能元素之一。如果未发生异常,则只执行

    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:
            ...
    

    虽然这个选项创建了一个附加的缩进层,但是对于那些普通的continue不起作用的情况,有必要记住这个选项。有时,当您需要在分支之前对错误和非错误情况进行额外处理时,会发生这种情况。

  4. 将整个if块放入try块。这样,只有在没有错误的情况下才会执行。这是我最不喜欢的选项,因为我喜欢我的try块被尽可能地修剪,以避免捕获我不想捕获的异常。在Python中,try相对于Java这样的语言来说,性能杀手的作用相对较小,因此对于简单的情况,这仍然是一个选项:

    try:
        guess = float(input("Please guess a number between 0 and 100: "))
        if guess < number and guess >= 0:
            ...
    except (ValueError, TypeError):
        print ("That isn't even a number!")
    

尝试使用else语句。你知道吗

除了捕获打印外,请让脚本继续运行。它将继续执行所有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()

相关问题 更多 >