Совместимость значений
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. Ошибка о точности преобразования исправлена явно.