Как преобразовать символьные вычисления в число на python
Я пробовал преобразовать строку "-5/x" в целое число и число с плавающей точкой, но не получилось. Кто может помочь? Пример кода:
y = input("Y= ")
primer = ''
count = int(input("Colvo: "))
i = 0
first_spisok = []
end_spisok = []
while i != count:
for j in range(1, len(y)):
if y[j] == "x":
first_spisok += y
first_spisok[j] = str(i)
for i in range(1, len(first_spisok)):
primer += first_spisok[i]
if float(primer) % 0.5 or float(primer) % 1:
end_spisok.append(float(primer))
i += 1
print(end_spisok)
Ответы (2 шт):
Т.к. вы не указали в каком виде вы задаёте x, я использовал модуль random.
import random
y = input('Y = ')
x = []
number_of_points = int(input('Num: '))
for i in range(number_of_points):
x.append(random.randint(1, 20))
result = [(x[i], float('{:.2f}'.format(eval(y+'[i]')))) for i in range(number_of_points)]
print(result)
Вариант 1. Если вам разрешено использовать внешние модули, есть отличный пакет для этих целей SymPy, устанавливаем его один раз через командную строку python -m pip install sympy.
Далее получается такой код для разбора и вычисления значения произвольного математического выражения с подстановкой переменных, для примера в коде вычисляю выражение с несколькими переменными:
import sympy
from sympy.parsing.sympy_parser import parse_expr
expr = parse_expr('-5/x + y + sqrt(z)')
x, y, z = sympy.symbols('x y z')
val = float(expr.evalf(subs = {x: 2, y: 0.1, z: 9}))
print(val)
Вывод:
0.6
Если не все переменные из выражения заданы в subs = ... то будет ошибка/исключение.
Вариант 2. Если не разрешено использовать внешних больших пакетов, то простейший вариант это использовать встроенный в Питон eval(), в таких выражениях можно например даже функции math модуля использовать:
from math import *
expr = '-5/x + y + sqrt(z)'
x, y, z = 2, 0.1, 9
val = eval(expr)
print(val)
Вывод:
0.6
Дополнение. Использование math модуля не обязательно, т.е. строка from math import * не нужна, если в выражении нет математических функций типа sqrt(x) и если например мы хотим не использовать ни одного модуля. Если нужен и импортировать все имена из math в глобальное пространство имён запрещено (через ... import * в коде выше), то можно использовать такую технику.
Внимание - eval() можно использовать только если выражение пришло из надёжного источника, т.е. например вы ввели его, а не произвольный злоумышленник из интернета. Т.к. eval() может исполнить произвольный Python код, даже вредоносный.