Я играл с логическими выражениями в интерпретаторе python, и я не могу понять, какую процедуру исполнения Python действительно использует под капотом. Я видел эту таблицу (http: // www.mathcs.emory.edu/~valerie/courses/fall10/155/resources/op_precedence.html) как описание приоритета оператора, который использует python.

1)

print("this") or True and 1/0 and print("tester")

Когда я набираю это в интерпретаторе python, я получаю вывод «this», а затем ошибку нулевого деления. Тем не менее, сайт, на который я ссылался, упоминает, что вызовы функций являются вторым по важности приоритетом, поэтому не следует ли сначала выполнять оба вызова функции print? Я знаю, что есть оценка короткого замыкания, но разве она не сработает, как только вы доберетесь до уровня приоритета ands, nots и ors?

2 )

True>False or print("hello")

Даже это выводит только True на интерпретаторе python. почему он не выполняет вызов функции print в первую очередь?

3 )

5 is 5 or 1/0

Это выводит True. Но не должно ли деление иметь более высокий приоритет, чем «есть», и не должно ли это выражение возвращать ZeroDivsionError?

Может кто-нибудь объяснить, что мне не хватает и как сказать, в каком порядке python будет выполнять логическое выражение?

0
purplejackfruit 28 Июн 2019 в 08:50

2 ответа

Приоритет не влияет на порядок, в котором python оценивает операторы. В 5 is 5 or 1/0 python сначала проверяет, истинно ли 5 is 5, и если да, то игнорирует второе утверждение. Другими словами, python всегда вычисляет первое утверждение первым, независимо от приоритета

0
3NiGMa 28 Июн 2019 в 06:11

Порядок приоритета используется синтаксическим анализатором для построения дерева разбора. Это не означает то же самое, что и порядок оценки.

В качестве примера возьмем ваш третий случай: 5 is 5 or 1/0. Порядок приоритета: /> is> or.

Дерево разбора будет выглядеть примерно так (в соответствии с приоритетом.)

     or
   /    \
  is    div
 / \    / \
5   5  1   0

Оценка (технически генерация кода) начинается сверху, в данном случае это узел or, согласно другому правилу, предоставленному генератору кода. Вывод генератора кода для or может выглядеть примерно так.

t = code(5 is 5)
if t goto L1
L2: code(1/0)
    goto L1
L1:

Порядок приоритета использовался только первоначально для создания дерева разбора. Как только дерево разбора построено, в игру вступают семантические правила (действия? Я забываю слова).

Поведение короткого замыкания встроено в семантическое правило узла or.

Постскриптум Этот ответ не для Python специально.

1
frederick99 2 Июл 2019 в 09:30