Arithmeti c порядок оценки в Python - PullRequest
1 голос
/ 23 января 2020

Я бы хотел, чтобы на этот вопрос ответили только ради любопытства. В следующем математическом выражении (и подобных ему):

(( (3 * 7)  + 5 * ((3 - 7) + (3 * 4))) + 9)

Оценивает ли Python (3 - 7) или (3 * 4) сначала? Дело в том, что эти самые внутренние скобки действительно можно оценить в любом порядке и достичь того же результата. Но какой порядок используется?

На данный момент я рассматриваю возможность установки точки останова в фактическом интерпретаторе Python, чтобы посмотреть, смогу ли я придумать какой-либо ответ (относительно того, как генерируется дерево разбора). ). Спрашиваю на IRC и такие безрезультатно. Спасибо за ваше время.

Ответы [ 2 ]

6 голосов
/ 23 января 2020

Вы можете проверить байт-код, чтобы убедиться, что левая сторона вычисляется первой:

dis.dis("""(a - b) + (c * d)""")
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 BINARY_SUBTRACT
              6 LOAD_NAME                2 (c)
              8 LOAD_NAME                3 (d)
             10 BINARY_MULTIPLY
             12 BINARY_ADD
             14 RETURN_VALUE

Порядок вычисления выражений является частью спецификации языка.

Порядок оценки

Python вычисляет выражения слева направо. Обратите внимание, что при оценке присваивания правая часть вычисляется перед левой частью.


Обратите внимание, что если вы используете литеральное выражение, такое как (3 - 7) + (3 * 4), оно не оценивается, но напрямую компилируется.

dis.dis("""(3 - 7) + (3 * 4)""")
  1           0 LOAD_CONST               0 (8)
              2 RETURN_VALUE
1 голос
/ 23 января 2020

Оценивает слева направо, вы можете проверить с помощью input() вызовов:

>>> (( (3 * 7) + 5 * ((input('1')) + (input('2')))) + 9)
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...