Как изменить приоритет в математическом порядке (звездочка)

#python #python-2.7 #numpy #math

#питон #python-2.7 #numpy #математика #python

Вопрос:

Я хочу, чтобы пользователи вводили математические формулы в мою систему. Как преобразовать формулу case1 в формулу case2 с помощью Python? Другими словами, я хотел бы изменить математический порядок специально для двойных звездочек.

 #case1
3*2**3**2*5
>>>7680

#case2
3*(2**3)**2*5
>>>960
  

Комментарии:

1. Что именно вы хотите сделать? Вы изменили математический порядок…

2. Вы хотите, чтобы возведение в степень связывалось более жестко, чем умножение? Вам нужно будет написать код, который проходит и вставляет круглые скобки, прежде чем передавать его в вашу вычислительную функцию.

Ответ №1:

Это не только не то, что поддерживает Python, но и действительно, зачем вам это нужно? Изменение BIDMA или PEMDA (в зависимости от вашего местоположения) не только даст вам неправильные ответы, но и запутает всех разработчиков, просматривающих код.

Просто используйте скобки, как в случае 2, для этого они и предназначены.

Комментарии:

1. Исправление, OP изменяет не другой приоритет оператора, а скорее порядок возведения в степень. Было бы понятнее, если бы пример был 2**3**2 vs. (2**3)**2 — в обоих случаях это один и тот же оператор — см. en.wikipedia.org/wiki/Order_of_operations#Special_cases

2. Даже ассоциативность в значительной степени установлена как стандартная, x**y**z всегда должна быть правильной ассоциативной, так и есть x ** (y ** z) . Это необходимо для таких вещей, как нормальное распределение, где у вас есть формула, подобная e ** (-t ** 2) .

Ответ №2:

Если предполагается, что пользователи вводят формулы в вашу программу, я бы посоветовал оставить все как есть. Причина в том, что возведение в степень в математике является правоассоциативным, то есть выполнение выполняется с верхнего уровня вниз. Например: a**b**c = a**(b**c) , по соглашению.

Есть некоторые программы, которые используют восходящее разрешение сложенного возведения в степень — MS Excel и LibreOffice — некоторые из них, однако, это противоречит обычному соглашению и всегда меня чертовски смущало.

Если вы хотите переопределить это поведение и при этом быть математически корректным, вы должны использовать скобки.

Вы всегда можете объявить свой собственный метод power, который будет разрешать так, как вы этого хотите — что-то вроде numpy.pow() . Вы могли бы перегрузить встроенное, но это слишком быстро.

Читать это

Ответ №3:

Ниже приведен пример для достижения этого с помощью re as:

 expression = '3*2**3**2*5'
asterisk_exprs = re.findall(r"d **d ", expression) # List of all expressions matching the criterion 
for expr in asterisk_exprs:
    expression = expression.replace(expr, "({})".format(expr)) # Replace the expression with required expression

# Value of variable 'expression': '3*(2**3)**2*5'
  

Чтобы оценить математическое значение str выражения, используйте eval как:

 >>> eval(expression) 
960
  

Комментарии:

1. Ваш вывод синтаксически неверен. Редактировать: было

2. Обновлен ответ.