Поиск и форматирование строк
Содержание курса
Функция форматирования отчётной строки: сборка всего вместе
Теперь, когда все инструменты разобраны по отдельности, соберём их в одну функцию. Задача: принять текст и ключевое слово, прогнать через несколько методов поиска и вернуть готовую отчётную строку.
Вот пошаговая логика:
Объявить функцию с параметрами — текст и ключевое слово.
Найти позицию ключевого слова через
find().Проверить, найдена ли подстрока (
position != -1), и вернуть соответствующее сообщение.Если найдена — вычислить остальные значения (
count(),startswith(),endswith()) и собрать результат в f-строку.Вернуть строку через
return.
Шаг 3 — ключевой. Вспомним из первого раздела: find() возвращает -1, когда подстрока не найдена. Если просто подставить -1 в строку 'найдено на позиции: -1' — это семантически бессмысленно и сбивает с толку. Правильнее вернуть отдельное сообщение:
def format_report(text, keyword):
position = text.find(keyword)
if position == -1:
return f'Слово "{keyword}" не найдено в строке'
occurrences = text.count(keyword)
starts = text.startswith(keyword)
ends = text.endswith(keyword)
return (
f'Слово "{keyword}" найдено на позиции: {position}; '
f'встречается {occurrences} раз(а); '
f'строка начинается с него: {starts}; '
f'строка заканчивается им: {ends}'
)
print(format_report('python is great, python wins', 'python'))
# Слово "python" найдено на позиции: 0; встречается 2 раз(а); строка начинается с него: True; строка заканчивается им: False
print(format_report('hello world', 'xyz'))
# Слово "xyz" не найдено в строке
Ранний return при position == -1 — это стандартный приём: как только стало ясно, что продолжать нет смысла, функция сразу возвращает результат. Остальной код выполняется только тогда, когда подстрока точно найдена.
Если контекст не требует отдельной обработки отсутствия подстроки (например, нужен только счётчик вхождений), выражения можно вынести прямо в {} f-строки без промежуточных переменных:
def format_report_simple(text, keyword):
return (
f'Слово "{keyword}" встречается {text.count(keyword)} раз(а); '
f'строка начинается с него: {text.startswith(keyword)}; '
f'строка заканчивается им: {text.endswith(keyword)}'
)
Этот компактный вариант не включает позицию и не обрабатывает случай «не найдено» — он подходит только тогда, когда отсутствие подстроки не нужно выделять отдельно. Для большинства реальных задач полный вариант с проверкой надёжнее.
Обратите внимание: функция не печатает ничего сама — она возвращает строку. Что с ней делать дальше — решает вызывающий код: напечатать, записать в файл, сравнить с эталоном. Это стандартный принцип: функция отвечает за формирование результата, а не за его судьбу.
Такой паттерн — принять данные, проверить наличие ключевого элемента, обработать и вернуть отформатированную строку — встречается постоянно: при генерации отчётов, логов, сообщений об ошибках. Когда в уроке про работу с файлами придёт время разбирать строки, прочитанные из текста, эта же структура функции окажется готовым шаблоном.
