Отладка кода: print, breakpoints, режим Debug
Зачем нужна отладка? 🐞
Представь ситуацию: код написан, но программа ведёт себя странно — выдаёт ошибку, зависает или просто не делает то, что должна. Вот тут и пригодится отладка! Это процесс поиска и устранения ошибок (багов) в коде.
Python предлагает несколько мощных инструментов для отладки:
- Старый добрый
print() - Точки останова (breakpoints)
- Режим Debug в IDE
Разберём каждый из них на практических примерах!
Метод "грубой силы": print() 🖨️
Самый простой и быстрый способ понять, что происходит в коде — добавить print() в подозрительные места.
def calculate_discount(price, discount):
print(f"Начальные значения: price={price}, discount={discount}") # Отладочный вывод
final_price = price - (price * discount)
print(f"Результат расчёта: {final_price}") # Проверяем результат
return final_price
# Вызываем функцию с тестовыми данными
result = calculate_discount(1000, 0.3)
print(f"Итоговый результат: {result}")
Когда использовать:
- Когда нужно быстро проверить значения переменных
- Для простых скриптов и небольших функций
- Когда другие инструменты недоступны (например, в онлайн-редакторах)
Плюсы:
✅ Простота использования
✅ Работает везде
✅ Не требует специальных инструментов
Минусы:
❌ Загрязняет код
❌ Нужно удалять/комментировать после отладки
❌ Неудобно для сложных проектов
Профессиональный подход: точки останова ⏸️
Точки останова (breakpoints) — это специальные метки, которые останавливают выполнение программы в определённой строке кода. После остановки можно вручную проверить значения всех переменных.
Как использовать в PyCharm:
- Кликни слева от номера строки — появится красная точка
- Запусти программу в режиме Debug (зелёный жучок)
- Программа остановится на breakpoint'е
def complex_calculation(data):
result = 0
for item in data: # Установи breakpoint здесь
if item % 2 == 0:
result += item * 2
else:
result += item
return result
numbers = [1, 2, 3, 4, 5]
print(complex_calculation(numbers))
Что можно делать в точке останова: - Проверять значения всех переменных - Выполнять код пошагово (Step Over, Step Into) - Менять значения переменных "на лету" - Продолжать выполнение до следующей точки
Преимущества:
✅ Не нужно изменять код
✅ Полный контроль над выполнением
✅ Можно исследовать сложные структуры данных
Полный контроль: режим Debug 🚦
Режим Debug — это продвинутый инструмент, который сочетает точки останова с возможностью пошагового выполнения кода.
Основные кнопки управления:
- ▶️ Continue — продолжить выполнение до следующей точки
- ⏩ Step Over — выполнить текущую строку, не заходя в функции
- ⏬ Step Into — зайти внутрь вызываемой функции
- ⏫ Step Out — выйти из текущей функции
Пример отладки рекурсивной функции:
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1) # Установи breakpoint здесь
print(factorial(5))
Что можно исследовать в режиме Debug:
- Стек вызовов функций (Call Stack)
- Локальные и глобальные переменные
- Поток выполнения программы
- Изменения переменных между шагами
Советы от Данилы Бежина 🎓
- Комбинируй методы: начинай с
print()для простых проверок, переходи к точкам останова для сложных случаев. - Используй условные точки останова: в PyCharm можно установить breakpoint, который срабатывает только при определённом условии.
- Смотри Call Stack: при отладке сложных вызовов всегда проверяй стек вызовов — он показывает цепочку функций.
- Экспериментируй с переменными: в режиме Debug можно менять значения переменных прямо во время выполнения.
Хочешь глубже разобраться в отладке? Посмотри уроки Данилы Бежина по работе с PyCharm!
Практическое задание 🔥
- Напиши функцию, которая принимает список чисел и возвращает сумму квадратов чётных чисел
- Добавь в неё несколько
print()для отладки - Проверь работу функции в режиме Debug с разными входными данными
- Установи точку останова внутри цикла и проанализируй значения на каждой итерации
def sum_of_squares(numbers):
total = 0
for num in numbers:
if num % 2 == 0:
total += num ** 2
return total
# Тестовые данные
print(sum_of_squares([1, 2, 3, 4, 5])) # Должно быть 20 (4 + 16)
Подсказка: попробуй изменить значения списка прямо в режиме Debug и посмотри, как меняется результат!