Почему “**” связывает сильнее, чем отрицание?

StackOverflow https://stackoverflow.com/questions/936904

  •  06-09-2019
  •  | 
  •  

Вопрос

Я только что был поражен следующим сценарием:

>>> -1 ** 2
-1

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Допустим, я хочу вычислить многочлен 3x3 - x2 + 5.

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

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

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

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

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

Точно так же они делают это и в математике.

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

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

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

Кулак, потому что это согласуется с математической нотацией:-2^2 = -4.

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

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

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

Это немного странно...

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

Однако взгляните на эту ссылку...порядок выполнения операций

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top