Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Вычисление значения математического выражения из строки

#python #python_3x


Есть строка содержащая математическое выражение вида:

1/3+2/3


Есть ли модуль вычисляющий значение таких выражений?
    


Ответы

Ответ 1



Вы можете воcпользоваться eval eval('1/3+2/3') вот тут можно почитать https://docs.python.org/3/library/functions.html#eval Но обычно с такими функциями проблемы с безопасностью в случае если вы получаете строку из вне ( пользовательский ввод например)

Ответ 2



С точки зрения безопасности (как уже сказал @Batanichek - с eval() нужно быть очень осторожным), производительности и гибкости лучше воспользоваться numexpr: In [6]: import numexpr as ne In [7]: ne.evaluate('1/3+2/3') Out[7]: array(1.0) In [8]: var1=10 In [9]: var2=2 In [10]: ne.evaluate('var1**var2') Out[10]: array(100, dtype=int32) Он, кстати, быстрее для более сложных вычислений, поддерживает использование переменных, поддерживает NumPy, SciPy и т.д. Numexpr поддерживает многопоточные вычисления (используя все доступные ядра процессора) и VML от Intel (Vector Math Library, который интегрирован в интеловский же Math Kernel Library (MKL)). Пример работы с обычным ("Vanilla Python") массивом: In [45]: lst = [1, 2.718281828] In [46]: ne.evaluate('log(lst)') Out[46]: array([ 0., 1.]) с NumPy массивом: In [50]: a = np.array([1, 2.718281828]) In [51]: ne.evaluate('log(a)') Out[51]: array([ 0., 1.]) Сравнение производительности с NumPy для массива, состоящего из 1го млн. элементов типа numpy.float64: In [36]: a = np.random.rand(10**6) In [37]: a.shape Out[37]: (1000000,) In [38]: len(a) Out[38]: 1000000 In [39]: %timeit np.log(a) 10 loops, best of 3: 24.3 ms per loop In [40]: %timeit ne.evaluate('log(a)') 100 loops, best of 3: 5.45 ms per loop In [41]: %timeit np.sqrt(np.sin(a)**2 + np.cos(a)**2) 10 loops, best of 3: 84.5 ms per loop In [42]: %timeit ne.evaluate('sqrt(sin(a)**2 + cos(a)**2)') 100 loops, best of 3: 6.32 ms per loop

Ответ 3



Вроде как считается безопасным аналогом eval import ast try: print(ast.literal_eval(1/3+2/3)) except ValueError as err: print(err) Только вот с данным выражением выдает ошибку

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

Отправить комментарий