
Полная версия
100 задач по Python: отладка кода
Диагностика:
– напечатать n и индекс i перед обращением;
– напечатать len массива;
– проверить условия остановки.
8.2. ValueError при int()
Причины:
– строка пустая;
– строка содержит не число (например, "10 20");
– есть лишние символы.
Диагностика:
– print(repr(line)) перед преобразованием;
– проверить split().
8.3. KeyError в словаре
Причины:
– ключ не добавлен;
– вы ожидаете, что ключ существует.
Исправления:
– использовать get(key, default);
– предварительно проверить if key in dict.
8.4. TypeError из-за смешения типов
Причины:
– числа как строки;
– None вместо значения;
– список вместо числа.
Диагностика:
– print(type(x), x)
– проследить, где переменная присваивается.
8.5. RecursionError
Причины:
– рекурсия слишком глубока (DFS на большом графе/дереве);
– бесконечная рекурсия из-за отсутствия базового случая.
Исправления:
– переписать на итеративный вариант;
– увеличить лимит, если это оправдано:
import sys
sys.setrecursionlimit(10**7)
В задачах лучше избегать необоснованного поднятия лимита без понимания риска.
9) Логические ошибки: как находить неверный ответ
9.1. Начать с маленького теста
Если вы не можете проверить ответ вручную, вы не можете эффективно отлаживать.
Задача: придумать тест, где вы точно знаете правильный результат.
9.2. Метод "ручной прогон"
Возьмите маленький вход и выполните алгоритм на бумаге:
– какие значения переменных после каждого шага;
– когда должен обновиться ответ.
Сравните с реальным выводом debug-печати.
9.3. Дифференциальная проверка (сравнение с наивным решением)
Для многих задач можно написать медленное, но простое решение и сравнивать ответы на случайных маленьких тестах.
Пример подхода:
– генерировать маленький массив длины до 8;
– вычислять ответ двумя способами;
– если ответы различаются, печатать тест и останавливать программу.
Это самый сильный метод для задач на массивы, строки, динамику, графы (на маленьких размерах).
9.4. Инварианты
Поддерживайте свойства, которые всегда должны быть истинны.
Примеры:
– в BFS расстояния не убывают при извлечении из очереди (для обычного BFS);
– в Дейкстре извлечённая вершина имеет минимальное расстояние;
– в сортировке после i шагов первые i элементов отсортированы.
Если инвариант нарушен, место нарушения – точка ошибки.
Конец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.










