преобразование строки в int приводит к сбою программы

#python

#python

Вопрос:

У меня есть этот код, запущенный в написанной мной игре в угадывание чисел, он работает отлично, если игрок следует инструкциям, но, как мы все знаем, пользователи никогда этого не делают. Если пользователь вводит просто пробел или любую строку, которая не является словом hint, то происходит сбой, указывающий недопустимый литерал для int() с основанием 10: при попытке преобразовать значение guess в целое число. Есть ли какой-либо способ обойти это или мне просто придется жить с сбоями?

 while repeat==1:
    repeat=0
    level1number=str(level1number)
    guess=input("What is your guess? ")
    guess=guess.lower()
    if guess==level1number:
        print("Well done, You have guessed my number!")
    elif guess=="hint":
        print("Hints are not available until level 3")
        repeat=1
    elif guess!=level1number:
        print("Sorry that is not my number, you have lost a life. :(")
        lives=lives-1
        repeat=1
        if lives<=0:
            print("You have lost all your lives, so this means I win")
            print("The program will now end")
            exit()
            input("")
        level1number=int(level1number)
        guess=int(guess)
        if guess<level1number:
            print("The target number is higher")
        else:
            print("The target number is lower")
  

Комментарии:

1. Перехватите исключение и продолжайте запрашивать допустимое значение.

2.Есть много способов обойти это. Вероятно, проще всего использовать while цикл и try except блок, чтобы продолжать запрашивать у пользователя входные данные, если они не могут быть преобразованы в int .

3. он запускает раздел цикла not equal to, если это не целевое число или слово hint, вызывающее сбой

4. Вы не должны приводить level1number к str и guess должно быть целым числом как можно скорее.

5. думаю, ошибка должна исходить из ядра «guess = int (угадать)»

Ответ №1:

Используйте что-то как

 if guess.isdigit() ...
  

(метод isdigit() возвращает true тогда и только тогда, когда все символы данной строки являются цифрами, то есть от 0 до 9).

Комментарии:

1. Это лучший ответ (на данный момент); пока он возвращает False, затем заставьте его снова запрашивать у пользователя его ввод.

2. @MarianD Вы знаете о подписанной версии этого? Например, ‘ -1’.isdigit() вернет false, но может вычисляться до числа. ‘ -1’.isnumeric() также вернет false

Ответ №2:

 while repeat==1:
    repeat=0
    level1number=str(level1number)
    guess=input("What is your guess? ")
    guess=guess.lower()
    if guess==level1number:
        print("Well done, You have guessed my number!")
    elif guess=="hint":
        print("Hints are not available until level 3")
        repeat=1
    elif guess!=level1number:
        print("Sorry that is not my number, you have lost a life. :(")
        lives=lives-1
        repeat=1
        if lives<=0:
            print("You have lost all your lives, so this means I win")
            print("The program will now end")
            exit()
            input("")
        level1number=int(level1number)
        try:
            guess=int(guess)
            if guess<level1number:
                print("The target number is higher")
            else:
                print("The target number is lower")
        except:
            print("Try again. Not a number")
  

Использование try/except блока решило бы вашу проблему. Взгляните

Редактировать: В вопросе. вы упомянули, что получаете сообщение об ошибке при вводе чего-либо, отличного от числа. На самом деле, это an exception , которое выдается, когда ваш код пытается преобразовать вашу входную строку в число, когда это невозможно ( guess = int(guess) ) из-за того, что входные данные не являются числом, точно так же, как a space . Итак, что делает мой код, так это то, что он улавливает исключение и не позволяет программе завершаться с исключением.

Просто попробуйте это один раз. Я знаю, что вы новичок, но лучше изучить exception handling как можно скорее, прежде чем писать все более сложные коды и приложения.

Надеюсь, это поможет!!

Комментарии:

1. спасибо, я не профессионал, и я никогда не слышал о try / except

2. я принял ответ, просто моя репутация недостаточно высока, чтобы это было видно