Создание собственной функции для использования в sympy.N()
Я хочу реализовать функцию dms() для калькулятора, подобно в калькуляторе windows. Для подсчёта результатов я использую метод sympy.N() на строке с итоговой формулой. Я бы хотел видеть код примерно таким:
from sympy import N
def do_smth(x):
return x+1
result = N('do_smth((8*7)-3)')
Как мне реализовать это? Просьба: если вы знаете способ лучше, как использовать библиотеку Sympy, не пишите в комментарии, что я не знаю Sympy и так далее. Предложите свой вариант.
Ответы (2 шт):
from sympy import N, Function, Symbol
# Определяем пользовательскую функцию
class do_smth(Function):
@classmethod
def eval(cls, x):
return x + 1
# Используем функцию в выражении
x = Symbol('x')
result = N(do_smth((8*7)-3))
print(result)
Пояснение работы скрипта:
Импорт модулей:
N используется для численного вычисления выражений.
Function используется для создания пользовательских функций.
Symbol используется для создания символических переменных.
Определение пользовательской функции:
Класс do_smth наследуется от Function, что позволяет использовать его как символическую функцию в SymPy.
Метод eval определяет, как будет вычисляться функция. В данном случае, он просто добавляет 1 к аргументу x.
Создание символической переменной:
Переменная x создается как символическая переменная, которая может быть использована в выражениях.
Вычисление значения функции:
Выражение (8*7)-3 передается в функцию do_smth, которая увеличивает его значение на 1.
Функция N используется для численного вычисления результата.
В примере ниже определены функции inc
и scale
и показано, как сделать чтобы SymPy использовала их при вычислении выражений.
Функцией N
воспользоваться не получится, но она делает свою работу вызывая sympify
для разбора строки и evalf
для вычисления. В sympify
принимает необязательный аргумент locals
со словарём символов. В строке defs = ...
он строится из кортежа функций. Вы можете делать это по другому, главное чтобы в результате получился словарь, отображающий имена в функции. В него же можно добавить константы, если нужно. И даже больше, если в вашем калькуляторе у пользователя есть возможность определять новые переменные, их тоже имеет смысл поместить в этот словарь.
from sympy import sympify
def inc(x):
return x + 1
def scale(x):
return 2 * x
defs = {f.__name__: f for f in (inc, scale)}
expr = 'scale(inc(((8*7)-3)))'
print(sympify(expr, locals=defs).evalf())