【问题标题】:Input validation for number guessing game results in error猜数字游戏的输入验证导致错误
【发布时间】:2020-08-24 08:54:35
【问题描述】:

这是我在这个社区的第一篇文章,当然我是初学者。我期待着有一天我可以帮助别人。无论如何,这是一个简单的代码,我想要它,以便在用户输入字符串时出现错误。不幸的是,它没有按照我想要的方式执行,这是代码:

number = 1

guess = int(input('Guess this number: '))

while True:
    try:
        if guess > number:
            print("Number is too high, go lower, try again")
            guess = int(input('Guess this number: '))
        elif guess < number:
            print("Too low, go higher, try again")
            guess = int(input('Guess this number: '))
        else:
            print("That is correct")
            break
    except (SyntaxError, ValueError):
            print("You can only enetr numbers, try again")

当程序执行时,它要求我“猜猜这个数字:”,当我写任何字符串时,例如“d”,它给出了错误:

Guess this number: d
Traceback (most recent call last):
  File "Numberguess.py", line 5, in <module>
    guess = int(input('Guess this number: '))
ValueError: invalid literal for int() with base 10: 'd'

感谢您的时间和支持。

【问题讨论】:

标签: python if-statement exception user-input


【解决方案1】:

问题出在第一行。当您将用户的输入直接转换为int时,当用户输入字母时,该字母无法转换为int,从而导致您收到错误消息。 要解决这个问题,你需要做

guess = input('Guess this number: ')
if not guess.isdigit():
    raise ValueError("input must be of type int")

【讨论】:

  • 你用这段代码实现了什么? input 返回一个字符串,因此 isinstance(guess, str) 将始终为 True
【解决方案2】:

我只会使用.isdigit()。该字符串将在该点进行验证,然后如果验证有效,您会将其转换为 int

guess = input('Guess this number: ')
if guess.isdigit():
    guess = int(guess)
else:
    print("You can only enter numbers, try again")

还值得一提的是,try/excepts 很酷,他们可以完成工作,但尝试将它们减少到零是一个好习惯,而不是捕获错误,而是事先验证数据。

下一个例子会这样做:

number = 1

while True:

    # Step 1, validate the user choice
    guess = input('Guess this number: ')
    if guess.isdigit():
        guess = int(guess)
    else:
        print("You can only enter numbers, try again")
        continue

    # Step 2, play the guess game
    if guess > number:
        print("Number is too high, go lower, try again")
    elif guess < number:
        print("Too low, go higher, try again")
    else:
        print("That is correct")
        break

【讨论】:

  • 非常感谢您的宝贵时间!这对我有帮助,你摇滚!
【解决方案3】:

看看这一行:

guess = int(input('Guess this number: '))

您尝试将字符串转换为 int,这是可能的,但前提是字符串表示数字。

这就是你得到错误的原因。 except 对您不起作用,因为您从“try”中获得了变量的输入。

顺便说一句,没有理由在if中输入,所以你的代码应该是这样的:

number = 1

while True:
    try:
        guess = int(input('Guess this number: '))

        if guess > number:
            print("Number is too high, go lower, try again")
        elif guess < number:
            print("Too low, go higher, try again")
        else:
            print("That is correct")
            break
    except (SyntaxError, ValueError):
            print("You can only enetr numbers, try again")

【讨论】:

    【解决方案4】:

    欢迎来到堆栈溢出!每个人都需要从某个地方开始

    看看下面的代码:

    # import random to generate a random number within a range
    from random import randrange
    
    
    def main():
        low = 1
        high = 100
    
        # gen rand number
        number = gen_number(low, high)
    
        # get initial user input
        guess = get_input()
    
        # if user did not guess correct than keep asking them to guess
        while guess != number:
            if guess > number:
                print("You guessed too high!")
                guess = get_input()
            if guess < number:
                print("You guess too low!")
                guess = get_input()
        # let the user know they guess correct
        print(f"You guessed {guess} and are correct!")
    
    
    def gen_number(low, high):
        return randrange(low, high)
    
    
    # function to get input from user
    def get_input():
    
        guess = input(f"Guess a number (q to quit): ")
        if guess == 'q':
            exit()
    
        # check to make sure user input is a number otherwise ask the user to guess again
        try:
            guess = int(guess)
        except ValueError:
            print("Not a valid number")
            get_input()
    
        # return guess if it is a valid number
        return guess
    
    
    # Main program
    if __name__ == '__main__':
        main()
    

    这是一个包含 Python 随机模块以在一个范围内生成随机数的绝佳机会。还有一个很好的递归示例,不断要求用户猜测,直到他们提供有效输入。如果可行,请将此答案标记为正确,如果您有任何问题,请随时离开 cmets。

    编码愉快!!!

    【讨论】:

    • 使用递归反复请求输入并不是最好的想法之一。事实上,这是一个坏主意。一个非常糟糕的主意。
    • if __name__ == '__main__': 之后应该只调用函数main 其余代码应该在的位置。使用您的方法,您向全局命名空间添加了太多名称。
    • Kickin_Wing,感谢您花时间和考虑保持代码简单。这个社区很棒。祝你周末愉快!
    • @chasetheidea 欢迎您!祝你好运,Python 是一门很棒的学习语言。祝您周末愉快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2013-10-09
    相关资源
    最近更新 更多