Создание собственной функции для использования в 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 шт):

Автор решения: Fox Fox
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 используется для численного вычисления результата.

→ Ссылка
Автор решения: Stanislav Volodarskiy

В примере ниже определены функции 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())
→ Ссылка