Может кто-нибудь объяснить, что мне не хватает и как сказать, в каком порядке python выполнит логическое выражение?
Приоритет влияет на то, каким образом «общие» операнды будут группироваться при разборе на дерево. После этого конкретная модель оценки каждого подвыражения вступает во владение.
print("this") or True and 1/0 and print("tester")
Вы получаете дерево, которое выглядит следующим образом (вы можете получить более подробную, но точную версию, используя модуль ast
и astpretty
, чтобы получить что-то читаемое):
or
print("this")
and
True
and
1/0
print("tester")
Затем оценка вступает во владение (после компиляции в байт-код, но это не меняет порядок операции):
- оценивается внешнее
or
- вычисляет первое
print
, которое возвращает ложное значение, поэтому
- оценивает первый
and
- оценивает
True
, что правда
- поэтому он оценивает второй
and
- который оценивает
1/0
который взрывается
True>False or print("hello")
Это анализирует до
or
>
True
False
print("hello")
or
вычисляет свой первый операнд
(> True False)
оценивается как True
or
является оператором короткого замыкания, он останавливается, как только находит истинное значение и возвращает его, поэтому он никогда не достигает значения print
5 is 5 or 1/0
Это разбирает на
or
is
5
5
/
1
0
or
оценивается
is
оценивается и возвращает True
как указано выше, or
является оператором короткого замыкания и возвращает первое истинное значение, поэтому оно сразу возвращается.
Я пропустил несколько битов, например. технически /
оценивает оба операнда, затем применяет их операцию, вызовы функций оценивают все их параметры , затем выполняет сам вызов.
and
и or
выделяются, потому что они выполняют логику после вычисления каждого операнда, а не после оценки всех их (они ленивы / короткого замыкания): and
возвращает первый ложный результат получает или возвращает первый истинный результат, который он получает, потенциально оценивая только первый из их операндов.