Как преобразовать символьные вычисления в число на 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 шт):

Автор решения: Skeggi

Т.к. вы не указали в каком виде вы задаёте 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)
→ Ссылка
Автор решения: Arty

Вариант 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 код, даже вредоносный.

→ Ссылка