#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_cases2. Даже ассоциативность в значительной степени установлена как стандартная,
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. Обновлен ответ.