Отладчик Pycharm отключается
Привет у меня есть список из четырех направлений и метод, как
directions = ["NORTH", "EAST", "SOUTH", "WEST"]
def rotate_left(self):
cycled = cycle(self.directions)
current = dropwhile(lambda x: x != self.direction, cycled)
self.direction = next(current)
но как-то после этого метода моя программа останавливается без каких-либо исключений
есть идеи почему? Спасибо
2 ответа
Похоже, проблема заключалась в том, что в моем коде никогда не могло быть выполнено условие dropwhile(). Из-за ленивого выполнения питонов казалось, что проблема была в том, что я вызвал next(), но это было только потому, что это было, когда выполнялся droptime (), заставляя его циклически проходить по бесконечному списку без выполнения условия.
Извините за тратить время всем.
Я смог повторить описание вашей проблемы со следующим кодом
from itertools import cycle, dropwhile
direction = None
directions = ["NORTH", "EAST", "SOUTH", "WEST"]
cycled = cycle(directions)
current = dropwhile(lambda x: x != direction, cycled)
direction = next(current)
Трудно сказать без остальной части вашего кода, но, судя по всему, начальное значение direction
не существует в directions
список; смысл это не NORTH
, SOUTH
, EAST
, или же WEST
(с учетом регистра). Это вызывает бесконечную итерацию между cycle
а также dropwhile
Если вы читаете документацию для itertools
, пока
Создайте итератор, который удаляет элементы из итерируемого до тех пор, пока предикат истинен; потом возвращает каждый элемент
Во-первых, учитывая dropwhile
отбрасывает элементы до тех пор, пока предикат равен true, он, наконец, остановится, как только достигнет ложного значения, а затем вернет оставшийся элемент. Во-вторых, использование цикла генерирует повторяющийся итератор
Сделайте итератор, возвращающий элементы из итерируемого и сохраняющий копию каждого. Когда итерация исчерпана, вернуть элементы из сохраненной копии. Повторяется до бесконечности
Поскольку значение direction
не существует внутри directions
, dropwhile
просматривает итератор бесконечной длины и никогда не достигает случая, который нарушает его