Если функция делает n % 2, строковый n включает операцию строкового форматирования, а не остаток от деления: обычно возникает TypeError либо получается строка. Поэтому тип нужно проверить или заранее разобрать ввод. Для целочисленного контракта неподходящий тип отклоняют; для текстового ввода используют int с обработкой ValueError.
Что произойдёт, если передать строку в функцию проверки чётности на Python?
Почему выражение n % 2 для строки не проверяет чётность и как явно разделить проверку числа и разбор пользовательского ввода.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Для функции return n % 2 == 0 результат зависит от типа аргумента. У строки оператор % означает старое форматирование. Например, "4" % 2 вызывает TypeError, а "%s" % 2 возвращает строку "2", сравнение которой с числом 0 даст False. Это не надёжная валидация чисел.
Строгий целочисленный контракт
def is_even(n: int) -> bool:
if isinstance(n, bool) or not isinstance(n, int):
raise TypeError("Ожидается целое число")
return n % 2 == 0
Здесь bool отклонён намеренно: в Python это подкласс int. Аннотация n: int сама по себе не выполняет проверку при вызове. Не стоит безусловно делать int(n) внутри функции: например, 4.9 превратится в 4, и ошибка входного контракта останется незаметной.
Если вход по договорённости текстовый
def is_even_text(text: str) -> bool:
if not isinstance(text, str):
raise TypeError("Ожидается строка")
try:
n = int(text, 10)
except ValueError as exc:
raise ValueError("Введите целое число") from exc
return is_even(n)
" -4 " будет принято, а "4.5" и пустая строка — нет. Если продукт требует более строгого формата, например только ASCII-цифры без пробелов и разделителей, его проверяют отдельно до преобразования. Невалидный ввод не следует возвращать как False: это смешало бы ошибку с корректным ответом «число нечётное».