У меня была такая же проблема.способ, которым я рекомендую вам обращаться с этим, состоит в том, чтобы создать временный файл Python для хранения функции, введенной пользователем.Вот пример, который я использовал в программе, которую я написал, чтобы нарисовать представление математических функций:
with open("function.py",'w') as file:
f=input('enter the funtion you want to draw example: 2*x+1 or e**x :\n')
file.write("from math import *\ndef f(x):\n\treturn "+f)
это создаст файл, содержащий функцию, которую я хочу вызвать следующим, вы должны вызвать функцию, которую вы написали в файле, чтобываша программа:
from function import f
теперь вы можете использовать свою функцию как обычную функцию python, если хотите, вы также можете удалить файл, в котором вы сохранили свою функцию, используя os.remove:
import os
os.remove("function.py")
Чтобы помочь вам понять, вот моя программа для рисования математических функций:
import numpy
import cv2
import os
from math import *
def generate(f,a,b,min,max,functionname='noname'):
ph=(b-a)/1920
pv=(max-min)/1080
picture=numpy.zeros((1080,1920))
for i in range(0,1920):
picture[1079-(int((f(a+(i+1)*ph)*1080/max))),i]=255
for i in range(1920):
picture[1079-(int((f(a+(i+1)*ph)*1080/max)))+1,i]=255
cv2.imwrite(functionname+'.png',picture)
with open("function.py",'w') as file:
f=input('enter the funtion you want to draw example: or e**x :\n')
file.write("from math import *\ndef f(x):\n\treturn "+f)
from function import f
os.remove("function.py")
d=input('enter the interval ,min ,max and the image file name. Separate characters with spacebar. Example: 0 1 0 14 exponontielle :\n').split(" ")
generate(f,int(d[0]),int(d[1]),int(d[2]),int(d[3]),d[4])