← Маршрут ML-инженерии

Урок · 2 мин чтения · упражнения и самопроверка

Строки и срезы

После урока: объяснить неизменяемость и выполнить упражнение «Нормализовать и проверить строку», обосновав выбранный подход..

Перед началом

Текст как последовательность

Строка Python — неизменяемая последовательность Unicode-символов. Можно читать символ по индексу, но нельзя присвоить новое значение text[0]. Методы возвращают новую строку: результат strip, lower или replace нужно сохранить, если он понадобится далее.

Индекс -1 означает последний символ. У пустой строки его нет. Срез text[start:stop:step] не включает stop и корректно ограничивается длиной. text[::-1] создаёт перевёрнутую строку. Срез сам по себе не изменяет исходник.

Нормализация по контракту

Если задача игнорирует регистр и пробелы, сначала нормализуйте строку, затем сравнивайте. Для простого учебного ASCII-ввода достаточно lower и проверки символов. Для общего текста casefold лучше подходит для сравнения без регистра, но нормализация Unicode — отдельная задача: визуально одинаковые символы могут иметь разные представления. Не удаляйте знаки и пробелы, если условие требует точное сравнение. split() без аргумента группирует пробельные разделители; split(',') делит по конкретной запятой и может дать пустые части. Для CSV с кавычками и запятыми внутри полей нужен модуль csv, а не ручной split. " ".join(parts) собирает строки с разделителем. Он требует строковые элементы.

Пример: палиндром

После подготовки строки сравните её с разворотом. Для строки длины n потребуется O(n) времени и дополнительная строка размера O(n). Позже два указателя позволят сравнивать символы без создания разворота. Пустая строка равна своему развороту; если по условию она запрещена, это нужно проверять отдельно.

Пошаговый пример

python
text = " Level "
normalized = text.strip().lower()
print(normalized)
print(normalized == normalized[::-1])

Ожидаемый вывод

text
level
True

strip удаляет крайние пробелы, lower меняет регистр, разворот level остаётся level.

Сделайте самостоятельно

Проверьте палиндром для "Race car", игнорируя пробелы и регистр. Затем объясните, почему при точном сравнении ответ другой.

Ответ и критерии проверки

text.replace(" ", "").lower() даёт racecar, равный развороту. Без нормализации сравниваются и пробел, и разные регистры, поэтому исходная строка не является точным палиндромом.

Проверьте понимание

1. Включает ли срез text[1:3] индекс 3?
2. Изменяет ли вызов text.lower() исходную строку?