Почему «**» связывает более тесно, чем отрицание? - PullRequest
9 голосов
/ 02 июня 2009

Меня просто укусил следующий сценарий:

>>> -1 ** 2
-1

Теперь, копаясь в документации по Python, ясно, что это предполагаемое поведение , но почему? Я не работаю ни с какими другими языками со встроенным оператором power, но отсутствие единственного связывания с отрицательным отрицанием, насколько это возможно, кажется мне опасным нелогичным.

Есть ли причина, по которой это было сделано таким образом? Другие языки с мощными операторами ведут себя аналогично?

Ответы [ 5 ]

22 голосов
/ 02 июня 2009

Это поведение такое же, как в математических формулах, поэтому я не уверен, в чем проблема или почему она нелогична. Можете ли вы объяснить, где вы видели что-то другое? «**» всегда связывает больше, чем «-»: -x ^ 2 не совпадает с (-x) ^ 2

Просто используйте (-1) ** 2, точно так же, как в математике.

4 голосов
/ 02 июня 2009

Краткий ответ: это стандартный способ старшинства в математике.

Допустим, я хочу оценить полином 3x 3 - x 2 + 5.

def polynomial(x):
    return 3*x**3 - x**2 + 5

выглядит лучше, чем ...

def polynomial
    return 3*x**3 - (x**2) + 5

И первый способ - это то, как математики это делают. Другие языки с возведением в степень работают так же. Обратите внимание, что оператор отрицания также связывает более свободно, чем умножение, поэтому

-x*y === -(x*y)

Так же, как и в математике.

3 голосов
/ 02 июня 2009

Если бы мне пришлось угадывать, это было бы потому, что наличие оператора возведения в степень позволяет программистам легко увеличивать числа до дробных степеней. Отрицательные числа, возведенные в дробные степени, заканчиваются мнимым компонентом (обычно), так что этого можно избежать, связывая ** более тесно, чем унарный -. Большинству языков не нравятся мнимые числа.

В конечном счете, конечно, это просто соглашение - и для того, чтобы сделать ваш код читаемым вами и другими пользователями, вы, вероятно, захотите явно сгруппировать вашу (-1), чтобы никто другой не попал в эту ловушку :) Удачи!

1 голос
/ 02 июня 2009

Мне кажется, интуитивно понятным.

Кулак, потому что он соответствует математическому обозначению: -2 ^ 2 = -4.

Во-вторых, оператор ** был широко представлен FORTRAN давно. В Фортране -2 ** 2 также равно -4.

0 голосов
/ 02 июня 2009

Ocaml не делает то же самое

# -12.0**2.0
  ;;
- : float = 144.

Это странно ...

# -12.0**0.5;;
- : float = nan

Посмотрите на эту ссылку, хотя ... порядок операций

...