Строки оцениваются как True в Python, если они не пусты, поэтому operator
здесь имеет значение '&'
(так как or
вернет первый аргумент, который оценивается как True
).Тестирование в командной строке:
operator = "&" or "|" or ">" or "=" or "~"
print(operator)
# '&'
Таким образом, каждый раз, когда вы перебираете list
(который вы должны переименовать, поскольку list
- зарезервированное слово), вы проверяете, действительно ли i == '&'
.Поскольку этого никогда не происходит, код в вашем первом блоке if
никогда не выполняется;так как этот код никогда не выполняется, nextelem
никогда не устанавливается.
Вот почему вы в конечном итоге получите следующее:
NameError: имя 'nextelem' не определено
Что касается остальной части вашего кода, у логики есть фундаментальные проблемы, которые не позволят ей делать то, что вы ожидаете, даже если вы запустите ее без выдачи исключения.
Прежде чем пытаться переписать его, я настоятельно рекомендую пройти через официальный учебник Python , чтобы получить четкое представление о структурах данных и управления, которые вам понадобятся для реализации этого алгоритма.
Исключительно ради предоставления примера правильной обработки списка и игнорирования оператора '~'
и приоритета оператора ...
input_string = "p & q | r"
values = input_string.split(" ")
print(values)
# ['p', '&', 'q', '|', 'r']
print(values[-2::-2] + values[-1::-2])
# ['|', '&', 'r', 'q', 'p']
values[-1]
дает последний элемент в списке.values[-1::-2]
возвращает срез массива, начиная с конца и возвращаясь назад на 2 элемента за раз, пока все элементы не будут обработаны.Таким образом, в этом случае это приведет к ['r', 'q', 'p']
.
values[-2]
, затем начнется со второго до последнего элемента в списке.Снова отступая на два, values[-2::-2]
возвращает ['|', '&']
.Конкатенация этих списков дает результат, который вы ищете, но только в очень определенных обстоятельствах;Решение для общего случая - это то, над чем вам нужно работать, как только вы освоитесь с основами Python (и возвращайтесь к SO, когда у вас есть конкретные вопросы / проблемы).