Противоположный ответ
Оператор not превращает истинное значение в False, ложное — в True. Если уже есть функция, проверяющая условие, противоположную проверку удобно определить через её результат, а не копировать всю логику.
Задание источника
Проверьте, одинаково ли читается переданная строка в обоих направлениях без учёта регистра. Затем создайте отрицательный предикат через первый:
def is_palindrome(text: str) -> bool:
normalized = text.lower()
return normalized == normalized[::-1]
def is_not_palindrome(text: str) -> bool:
return not is_palindrome(text)
Примеры
is_palindrome("шалаш") и is_palindrome("ШаЛаШ") дают True. Для "python" результат False, а is_not_palindrome возвращает противоположное значение.
Срез [::-1] создаёт обратную последовательность кодовых точек строки. lower создаёт вариант в нижнем регистре, не меняя исходный аргумент.
Точное правило нормализации
Условие требует игнорировать регистр, но не пробелы и знаки препинания. Поэтому фраза с расставленными пробелами может не пройти проверку, даже если после их удаления стала бы палиндромом. Добавить такое удаление можно лишь как отдельное расширение.
Для сложных Unicode-текстов правила визуального сравнения, нормализации и регистронезависимости могут потребовать более точной постановки. Здесь сохранён начальный алгоритм источника, рассчитанный на обычные учебные строки.
Пустая строка
Пустая строка равна своему обратному срезу, поэтому в данной реализации она считается палиндромом. Отрицательный предикат возвращает для неё False. Это следует из кода; дополнительное требование непустого слова в исходном задании не сформулировано.
Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Упражнение сохранено; предел нормализации указан.