Не вдаваясь в конкретные проблемы с вашим кодом, которых, как вы сказали, много, я дам краткий ответ на актуальный вопрос в заголовке
Что может быть не так и как я могу найти [ошибки в моем коде]?
Вместо того, чтобы рассматривать ваш код как одну большую сложную функцию, на которую вы должны смотреть и понимать все сразу (я редко могу хранить более 10 строк кода в своем собственном внутреннем кеше мозга одновременно), попробуйте разбить его на части на маленькие кусочки: «Сначала я делаю это и ожидаю этого результата. Затем я беру этот результат и делаю это с ним, и ожидаю другого результата».
Из вашего описания проблемы кажется, что вы уже так думаете, но вы все равно выбросили этот большой кусок кода и, похоже, изо всех сил пытались выяснить, где именно проблема. Многие новички напишут большую кучу кода, а затем при тестировании будут рассматривать его как черный ящик. Например: «Я не получаю правильный ответ и не знаю, где начинается проблема». Это где обучение хорошим навыкам отладки имеет решающее значение.
Сначала я разбил бы вещи на мелкие кусочки, чтобы просто попробовать в интерактивном приглашении Python. Вставьте фиктивные значения для различных переменных и убедитесь, что небольшие фрагменты кода (от 1 до 5 строк или около того, достаточно малые, чтобы их можно было легко рассуждать) делают именно то, что вы ожидаете сделать с различными значениями переменных.
Если это не поможет, то для начала проверенный и надежный метод, часто как для начинающих, так и для опытных разработчиков, состоит в том, чтобы загадать ваш код с помощью операторов print. В таком количестве мест, которое, по вашему мнению, необходимо, поместите оператор для вывода значений одной или нескольких переменных. Как print("exp = %s; result = %s" % (exp, result)
. Поместите это в столько мест, сколько вам нужно, чтобы отслеживать значения некоторых переменных в процессе выполнения. Посмотрите, где он начинает давать ответы, которые не имеют смысла.
Иногда это трудно сделать, хотя. Возможно, вы не сможете угадать наиболее эффективные места для размещения операторов print
или даже то, что важно напечатать. В подобных случаях (и IMO в большинстве случаев) более эффективно использовать интерактивный отладчик, такой как встроенный в Python pdb
. Есть много хороших ресурсов для изучения pdb
, но основы не должны занимать слишком много времени, чтобы спуститься и избавят вас от головной боли.
pdb
будет запускать ваш код построчно, останавливаясь после каждой строки (и в циклах он будет проходить через каждый цикл в цикле), позволяя вам проверять содержимое каждой переменной перед переходом к следующей строке , Это дает вам полную возможность проверить, что каждая часть вашего кода выполняет или не выполняет то, что вы ожидаете, и должно помочь вам определить многочисленные проблемные области.