Module (79%)
Section (14%)

Когда данные не такие, какими они должны быть

Напишем кусок чрезвычайно тривиального кода - он прочитает натуральное число (неотрицательное целое) и выведет его обратное. Таким образом, 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.

Сейчас мы не будем тратить много времени на это - Вы найдете более подробные объяснения оператора is odel>is в модуле курса, посвященном объектно-ориентированному программированию.

Вы можете удивиться, что мы не хотим, чтобы вы выполняли предварительную проверку данных. Почему? Потому что Python не рекомендует это. Действительно.