Глава 8 · Играем с буквами и словами

Отладка проблем со строками

Строки часто выглядят правильными на глаз, а ломаются из-за одного невидимого символа. Учимся находить и чинить такие ошибки.

Строки — источник особенно коварных ошибок: они часто выглядят правильно на глаз, а ломаются из-за одного невидимого символа. Разберём самые частые ситуации.

Невидимые пробелы

nevidimye_probely.py
password = "секрет "     # случайный пробел в конце!
print(password == "секрет")   # False — а на глаз не отличить
print(repr(password))          # 'секрет ' — repr() выдаёт пробел
repr() — ваш главный инструмент
Мы уже видели repr() в разделе 8.2 — он показывает строку «как есть», включая пробелы и служебные символы, которые print() визуально скрывает.

Забытая кавычка

zabytaya_kavychka.py
# text = "Привет, мир!    # забыли закрывающую кавычку
# SyntaxError: unterminated string literal

Неправильное экранирование

nepravilnoe_ekranirovanie.py
# path = "C:\new_folder"   # \n здесь превратится в перенос строки!
print("C:\new_folder")
# C:
# ew_folder   — совсем не то, что хотели

print(r"C:\new_folder")    # C:\new_folder — raw-строка (раздел 8.3) решает проблему

Склеивание строки с числом

stroka_plyus_chislo.py
score = 95
# print("Результат: " + score)   # TypeError
print("Результат: " + str(score))   # исправлено — явное преобразование
print(f"Результат: {score}")        # ещё лучше — f-строка сама преобразует

find() vs index() при отсутствии подстроки

find_vs_index_oshibka.py
text = "Python"
print(text.find("java"))    # -1 — тихо возвращает -1, легко пропустить в коде
# text.index("java")        # ValueError — а вот index() сразу сообщает об ошибке

Частая ошибка — забыть, что find() при отсутствии подстроки возвращает -1, а не False или None. Проверка вроде if text.find("java"): сработает неверно, потому что -1 — это истина в логической проверке! Правильно — сравнивать явно: if text.find("java") != -1:.

input() «на самом деле» не число

input_ne_chislo.py
age = input("Возраст? ")   # даже если ввели "28" — это строка "28"
# print(age + 1)           # TypeError — забыли int()
print(int(age) + 1)         # правильно

Итоговая шпаргалка отладки строк

СимптомПричинаКак исправить
Сравнение == неожиданно Falseневидимый пробел или другой регистрrepr(), .strip(), .lower()
SyntaxError: unterminated stringзабыта закрывающая кавычкапроверить парность кавычек
Текст «сломался», появился неожиданный перенос строкислучайный \n в пути/текстеraw-строка r"..."
TypeError: can only concatenate strсложение строки с числом через +str() или f-строка
if text.find(...) ведёт себя странно-1 — это истина в булевой проверкесравнивать != -1 явно
TypeError при арифметике с input()input() всегда возвращает строкуint()/float()
★★ Самостоятельная задача
Найдите ошибку

В строке `total = "Сумма: " + 100` есть ошибка. Определите её тип, объясните причину и перепишите строку двумя разными способами, чтобы она работала.

Практика: отладка строковых ошибок
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →