Вы имеете дело с ошибкой logi c. Давайте начнем с текущей версии (2-й):
if a == "before" or a == "after":
Это читается как Engli sh, условие действительно, если a
равно "before"
или "after"
. Однако ваша первая (неправильная) версия:
if a != "before" or a != "after":
Это всегда будет True
, поскольку a
не может иметь 2 значения, поэтому одна из ветвей or
всегда будет True
.
Решение :
Давайте применим L Моргана де Моргана aws, чтобы увидеть, как инвертировать условные логики c. Чтобы представить обратный логарифм c вашего правильного регистра, который был
A or B
, нам нужно
not (A or B)
, которое согласно l aws равно
(not A) and (not B)
Поэтому правильной версией для вашего первого оператора if
должно быть:
if a != "before" and a != "after": # notice the and instead of the or
Примечание для стороны : чтобы упростить тестирование с несколькими значениями, попробуйте использовать следующее Подход:
if a in ("before", "after"):
или
if a not in ("before", "after"):
Это читается намного проще, поэтому также легче рассуждать с