'<'案件之间不支持 - 数字猜谜游戏

时间:2017-05-23 16:39:57

标签: 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()

当用户输入浮点数或整数值作为“猜测”时这很好用,如果用户输入的数字最初只有一个数字,我似乎抓住了Try-Except子句,但程序似乎也继续到“如果”的陈述。我得到一个TypeError说''&lt;' “str”和“float”实例之间不支持。

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

2 个答案:

答案 0 :(得分:3)

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

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

  1. continue块中使用except语句告诉循环继续运行而不处理以下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,而不是在循环外部进行一次初始化:

    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那么干净。

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

    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!")
    

答案 1 :(得分:0)

尝试使用else语句。

您的除了捕获打印,但让脚本继续运行。即使捕获时,它也会继续发送所有if语句。你想要做的是当命中除外时跳过你的函数的主要逻辑。使用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()