DamiRocK

Python: ошибка типов и явный выбор между арифметикой и текстом

Вычисляем 7−(−8−−2), затем исследуем вариант со строкой ‘7’. Отделяем динамическую типизацию от правил преобразований и исправляем утверждение о точности int→float.

Совместимость значений

Python не превращает строку в число только потому, что она похожа на число. 1 + "7" вызывает TypeError. Для арифметики нужно явно получить число, например 1 + int("7"); для текста — str(1) + "7".

Эти два решения дают соответственно 8 и "17". Преобразование выбирается по смыслу задачи, а не как способ любой ценой убрать ошибку.

Задание источника

Первый игровой результат равен 7, второй задан выражением −8−(−2). Найдите их разность:

print(7 - (-8 - -2))

Внутреннее выражение равно −6, ответ — 13. Вариант '7' - (-8 - -2) недопустим: вычитание строки и целого не определено. Исправление для числового смысла — int('7') - (-8 - -2).

Неявное смешение чисел

1 + 1.5 допустимо и возвращает 2.5. Но утверждение источника, что любое целое точно представимо как float, неверно. Например:

number = 2 ** 53 + 1
print(int(float(number)) == number)  # False

У целых Python произвольная доступная точность, а у обычного float ограниченное число значащих двоичных разрядов. Поэтому такое преобразование может терять информацию.

Два разных понятия типизации

Динамическая типизация описывает проверку типов при выполнении и связывание имён со значениями. «Сильная» типизация в этом уроке относится к ограниченности неявных преобразований несовместимых значений. Это не противоположность динамической типизации и не обещание, что все ошибки будут обнаружены до запуска.

Hexlet / Code Basics и участники · Исходный урок · Точность float: документация Python · GNU AGPL v3. Ошибка о точности преобразования исправлена явно.

Reading preferences

Appearance
Contrast
More options

Saved only in this browser. Your device’s reduced-motion setting is always respected. Browser zoom works throughout the site.