Оператор Else не выполняется со строковым или плавающим вводом

#python #if-statement

#python #if-оператор

Вопрос:

 num1 = int(input("Enter the first integer: "))
num2 = int(input("Enter the second integer: "))  

if (str(num1).isdigit()) and (str(num2).isdigit()):
    if num1>num2:
        print(num2, num1)
    else:
        print(num1, num2)
else:
    print("That is not an integer!")
  

Ошибка, которую я получаю:

Обратная трассировка (последний последний вызов):

Файл «C:Usersshrad.spyder-py3temp.py «, строка 183, в num2 = int(ввод(«Введите второе целое число: «))

Ошибка значения: недопустимый литерал для int() с основанием 10: ‘2.2’

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

1. 2.2 — это float, а не int, но вы пытаетесь преобразовать его в int.

2. Ваш код отлично работает в моем редакторе pycharm. просто удалите int и напишите num1 = input(«Введите первое целое число: «).

Ответ №1:

Вы пытаетесь преобразовать в значение int до того, как проверите, состоит ли оно из цифр. Подождите, пока вы не выполните этот тест, прежде чем выполнять преобразование.

 num1 = input("Enter the first integer: ")  # keep it as a string for now
num2 = input("Enter the second integer: ")

if num1.isdigit() and num2.isdigit():
    num1 = int(num1)  # NOW convert to int
    num2 = int(num2)
    if num1>num2:
        print(num2, num1)
    else:
        print(num1, num2)
else:
    print("That is not an integer!")
  

Кстати, имейте в виду, что ваш isdigit тест не будет работать для целых отрицательных чисел.

Ответ №2:

int() будет принимать только целое число — то есть число без десятичной точки, поэтому оно не будет принимать 2.2. Вы, вероятно, захотите использовать float() .

Ответ №3:

2.2 является float , а не int an, но вы пытаетесь преобразовать его в int .

Ответ №4:

Ну, вы знаете, что они говорят: «никогда не доверяйте пользовательскому вводу». Даже если пользователь — это, ну, вы сами.

Оператор: input("Enter the first integer: ") возвращает строку (ту, которую вы ввели), которая, в свою очередь, передается в int() , которую пытаются преобразовать в целое число.

При вводе строки в качестве входных данных функция int требует, чтобы эта строка строго отображала целое число (а не число с плавающей запятой, как, скажем, 2.2)

Вы можете поэкспериментировать с самой первой строкой: num1 = int(input("Enter the first integer: ")) затем print(num1) , чтобы выяснить, как это работает для себя; когда это вызывает, а когда нет.

Проблема в опубликованном вами коде заключается в том, что вы сначала пытаетесь преобразовать в int, а позже проверяете, действительно ли входные данные были int. Итак, интерпретатору Python пришлось сначала столкнуться с проблемой и использовать свой собственный автоматический способ сообщить об этом: исключение.

Способ обойти это может заключаться в том, чтобы отложить покрытие string -> int до тех пор, пока это действительно не понадобится. К счастью, это только одно место в сравнении, которое затем станет: if int(num1) > int(num2): . Это избавило бы вас от проблем с преобразованиями int () в начале, плюс обратные преобразования в строку для проверки int ( if (str(num1).isdigit()) and (str(num2).isdigit()): может просто стать if num1.isdigit() and num2.isdigit(): , поскольку num1, num2 еще не были скрыты. )

В качестве альтернативы, если вы хотите, чтобы десятичные числа с запятой преобразовывались без ошибок, вы можете использовать float() функцию (которая также может удобно преобразовывать значение int).

Вы также можете попробовать использовать обработку исключений, например:

 try:
    num1 = int(input("Enter the first integer: "))
    num2 = int(input("Enter the second integer: "))
except Exception as e:
    print("Error converting input to integers", e)
  

что, в свою очередь, избавит вас от необходимости проверки приведенных ниже входных данных…