Глава 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, без установки