实施 Try/Except 时出错

时间:2021-03-17 13:34:09

标签: python

我正在尝试为我的猜谜游戏添加一个尝试/除了来自用户的非数字条目。我不太确定如何用我的代码实现它,但我确实尝试过,但出现错误:

<块引用>

ValueError: 以 10 为基数的 int() 的无效文字:'v'

我不确定如何重新排列我的代码以使其与 try/except 一起工作。

def guessing_game(secret_number: int, user_guess: int):
   num_tries: int = 0
   user_name: str = input("Please enter your name: ")
   print(f"Hello {user_name}, i am thinking of a number between 1 and 20")
   secret_number: int = randint(1, 19)
   user_guess: int = int(input("Guess what it is: "))

   try:
      while num_tries != 5:
         if user_guess > secret_number:
            user_guess = int(input("Your guess is too high. Try again: "))
         elif user_guess < secret_number:
            user_guess = int(input("Your guess is too low. Try again: "))
         else:
            print(f"Congrats {user_name}, {secret_number} was the number i was thinking of")
            break
         num_tries += 1
      if user_guess != secret_number and num_tries == 5:
         print(f"Sorry.The number I was thinking of was {secret_number}")

   except ValueError:
      print("Error, value must be numerical")

guessing_game(2, 8)

2 个答案:

答案 0 :(得分:0)

您可能正在寻找这样的东西。无需在此处将所有内容都包装在一个函数中(无论如何您都没有使用传入的两个参数)。

  • 外部 for 循环处理在所有尝试都用完后停止游戏; Python 的(非常独特)for/else 结构处理输掉比赛。

  • 只要用户提供无效输入,内部 while 循环就会循环;您可以在其中添加 if not (1 <= user_guess <= 19): raise ValueError() 以验证用户是否愚蠢并输入例如-169

  • 为简化起见,只剩下一个 input(),游戏循环会为它修改 prompt

from random import randint

user_name: str = input("Please enter your name: ")
print(f"Hello {user_name}, i am thinking of a number between 1 and 20")
secret_number: int = randint(1, 19)
prompt = "Guess what it is: "
for num_tries in range(5):
    while True:
        try:
            user_guess: int = int(input(prompt))
            break  # out of the while
        except ValueError:
            print("Error, value must be numerical")

    if user_guess > secret_number:
        prompt = "Your guess is too high. Try again: "
    elif user_guess < secret_number:
        prompt = "Your guess is too low. Try again: "
    else:
        print(f"Congrats {user_name}, {secret_number} was the number i was thinking of")
        break
else:  # for loop was not `break`ed out of
    print(f"Sorry. The number I was thinking of was {secret_number}")

答案 1 :(得分:0)

错误解释:

您没有正确捕获异常,因为输入转换在 try 块之外。

当用户尝试输入文字字符串时,该行:

user_guess: int = int(input("Guess what it is: "))

引发 ValueError 因为该字符串不是 int-castable 并且指令不在 try 中,这意味着默认 traceback 处理异常。

只需将该行移动到 try 块内

try:
    user_guess: int = int(input("Guess what it is: "))

代码改进:

话虽如此,您需要更好地组织您的代码。首先,您的函数应该只是在用户输入和密码之间进行匹配。然后您将创建循环并为每个用户输入调用该函数:

def guessing_game(secret_number: int, user_guess: int):
    if user_guess > secret_number:
        print("Your guess is too high.")
    elif user_guess < secret_number:
        user_guess = print("Your guess is too low.")
    else:
        print(f"Congrats {user_name}, {secret_number} was the number i was thinking of")
        return True

user_name = input("Please enter your name: ") # String casting is redundant here.
print(f"Hello {user_name}, i am thinking of a number between 1 and 20")
secret_number = randint(1, 19) # Why not (1,20) though?

# Here is the loop. It keeps prompting the user to enter a number and if the 
# input represents a valid integer the function is called to compair them.
num_tries = 0
while True:
    if num_tries == 5:
        print(f"Sorry.The number I was thinking of was {secret_number}")
        break
    try:
       user_guess = int(input("Guess what it is: "))
       if guessing_game(secret_number, user_guess) == True:
           break
           
    except ValueError:
        print("Error, value must be numerical")

    num_tries += 1
       
相关问题