Когда данные не такие, какими они должны быть
Напишем кусок чрезвычайно тривиального кода - он прочитает натуральное число (неотрицательное целое) и выведет его обратное. Таким образом, 2
превратится в 0.5
(1/2), а 4
- в 0.25
(1/4). Вот программа:
value = int(input('Enter a natural number: '))
print('The reciprocal of', value, 'is', 1/value)
Есть ли что-нибудь, что может пойти не так? Код такой короткий и такой компактный, что не похоже, чтобы мы обнаружим там какие-либо проблемы.
Кажется, Вы уже знаете, куда мы идем. Да, Вы правы - ввод данных, которые не являются целыми числами (что также включает в себя ввод вообще ничего), полностью испортит выполнение программы. Вот что увидит пользователь кода:
Traceback (most recent call last):
File "code.py", line 1, in
value = int(input('Enter a natural number: '))
ValueError: invalid literal for int() with base 10: ''
output
Все строки Python значимы и важны, но последняя строка кажется наиболее ценной. Первое слово в строке - это имя исключения, из-за которого Ваш код останавливается. Здесь это ValueError
. Остальная часть строки - это просто краткое объяснение, которое более точно указывает причину возникшего исключения.
Как Вам с этим справиться? Как защитить свой код от прерывания, пользователя от разочарования, а себя от неудовлетворенности пользователя?
Самая первая мысль, которая может прийти Вам в голову, - это проверить, верны ли данные, введенные пользователем, и отказаться от сотрудничества, если данные неверны. В этом случае проверка может основываться на том факте, что мы ожидаем, что входная строка будет содержать только цифры. Вы уже должны уметь реализовать эту проверку и написать ее самостоятельно, не так ли? Также можно проверить, является ли тип переменной текущего значение
int
(в Python есть специальные средства для таких проверок - это оператор с именем is
. Сама проверка может выглядеть так:
type(value) is int
и принимает значение true
, если тип переменной текущего значения - int
.
Сейчас мы не будем тратить много времени на это - Вы найдете более подробные объяснения оператора
Вы можете удивиться, что мы не хотим, чтобы вы выполняли предварительную проверку данных. Почему? Потому что Python не рекомендует это. Действительно.