PDA

Visualizza la versione completa : [python] fare interpretare una stringa come una funzione


suomi_viking_86
08-03-2005, 20:09
ciao, come posso fare per fare interpretare una stringa come una funzione?
io ho provato (funziona) creando un nuovo file .py dove definisco la funzione per poi importarla ma mi sembra molto laborioso, c' qualche soluzione migliore?

suomi_viking_86
12-03-2005, 15:56
vi posto il codice che ho scritto per risolvere il problema:


FX = open("fx.py","w")
FX.write("def f(x):\n")
FX.write("\t\treturn 0\n")
FX.close()
import fx
funzione=raw_input("f(x):")
FX = open("fx.py","w")
FX.write("def f(x):\n")
FX.write("\tfrom math import *\n")
FX.write("\ttry:\n")
FX.write("\t\ty="+funzione+"\n")
FX.write("\t\treturn y\n")
FX.write("\texcept:\n")
FX.write("\t\treturn 0\n")
FX.close()
reload(fx)

in questo modo posso chiamare la funzione con fx.f(x) e tutto funziona
esiste qualche procedimento meno laborioso?

KornShell
12-03-2005, 18:34
sinceramente non ho capito il problema...
cosa vuoi fare esattamente?

suomi_viking_86
12-03-2005, 19:58
ho creato una gui che traccia il grafico di una funzione inserita tramite una casella Entry (in TK) e non riuscivo a fare interpretare il testo immesso come una funzione

KornShell
13-03-2005, 02:03
non capisco perche' vuoi scrivere nella entry tutta la funzione, premetto che non conoscendo il programma che stai scrivendo magari non e' fattibile, ma non sarebbe meglio impostare la funzione che prenda i valori inseriti nella entry?

Ikitt
13-03-2005, 19:49
Originariamente inviato da suomi_viking_86
ciao, come posso fare per fare interpretare una stringa come una funzione?
io ho provato (funziona) creando un nuovo file .py dove definisco la funzione per poi importarla ma mi sembra molto laborioso, c' qualche soluzione migliore?

Se il seguente e` migliore, non lo e` di molto :)



>>> x = [2, 0, 1]
>>> x
[2, 0, 1]
>>> f = "2*x[1]-x[0]+x[1]"
>>> eval(f)
-2

suomi_viking_86
16-03-2005, 18:57
vi posto il codice del programma che ho creato.
@Ikitt, con il mio modo posso importare qualsiasi funzione supportata da python, con il tuo devo accontentarmi delle polinomiali


from Tkinter import *
from math import *
imp = open("fx.py","w")
imp.write("def f(x):\n")
imp.write("\t\treturn 0\n")
imp.close()
import fx as FX
App=Tk()

#creo il menu
def draw():
if funzione.get()!="":
#creo la funzione
imp = open("fx.py","w")
imp.write("def f(x):\n")
imp.write("\tfrom math import *\n")
imp.write("\ttry:\n")
imp.write("\t\ty="+str(funzione.get())+"\n")
imp.write("\t\treturn y\n")
imp.write("\texcept:\n")
imp.write("\t\treturn 0\n")
imp.close()
reload(FX)
#creo il grafico della funzione
canv.create_line(data())
def drawDf():
canv.create_line(dataDf(),stipple="gray25")
menu=Frame(width=80)
def clear():
toerase =canv.find_all()
toerase=toerase[CANV:len(toerase)]
for K in toerase:
canv.delete(K)
#menu.grid_propagate(0)
labelfx=Label(menu,text="funzione:")
funzione=Entry(menu)
draw=Button(menu,text="draw",command=draw)
Df=Button(menu,text="f'",command=drawDf)
clear=Button(menu,text="clear", command=clear)
labelfx.grid(row=0,sticky=NW)
funzione.grid(row=1,sticky=NW)
draw.grid(row=2,sticky=NW)
Df.grid(row=3,sticky=NW)
clear.grid(row=4,sticky=NW)
menu.grid(column=0,sticky=NW)
#coordinate del punto
def oncanvas(move):
XY["text"]="("+str(float(move.x-centro[0])/20)+","+str(-float(move.y-centro[1])/20)+")"
XY=Label(menu, text="(x,y)",width=15)
XY.grid_propagate(0)
XY.grid(row=5,sticky=NW)
centro = [400,300]

#importo i dati della funzione
def Dfx(x):
Dy=(FX.f(x+0.00000001)-FX.f(x))/0.00000001
return Dy
def data():
fx=[]
x0=-50
xn=50
while x0 <= xn:
fx.append([20*x0,-20*FX.f(x0)])
x0=x0+0.1
return fx
def dataDf():
D=[]
x0=-30
xn=30
while x0 <= xn:
D.append([20*x0,-20*Dfx(x0)])
x0=x0+0.1
return D

xmax=1000
ymax=2000
xmin=-1000
ymin=-2000

#creo il canvas e lo scroll
canv=Canvas(height=600,width=800,background="white", scrollregion=(xmin,ymin,xmax,ymax))
#modifico lo scroll per spostare anche le coordinate del centro
def scrY(method,dir,unit):
canv.yview(method,dir,unit)
centro[1]=centro[1]-int(dir)*60
scrollY = Scrollbar (orient=VERTICAL,command=scrY)
scrollY.grid ( row=0, column=2, sticky=N+S )
def scrX(method,dir,unit):
canv.xview(method,dir,unit)
centro[0]=centro[0]-int(dir)*80
scrollX = Scrollbar (orient=HORIZONTAL,command=scrX )
scrollX.grid (row=1, column=1, sticky=E+W )
canv["xscrollcommand"] = scrollX.set
canv["yscrollcommand"] = scrollY.set
#creo gli assi cartesiani
if ymax<600:
ymax=600
canv.create_line(0,ymin,0,ymax)
canv.create_line(xmin,0,xmax,0)
x=0
while x < xmax:
x=x+20
canv.create_line(x,-5,x,5)
x=0
while x > xmin:
x=x-20
canv.create_line(x,-5,x,5)
y=0
while y < ymax:
y=y+20
canv.create_line(-5,y,5,y)
y=0
while y > ymin:
y=y-20
canv.create_line(-5,y,5,y)
#griddo tutto
canv.grid(row=0,column=1)
CANV=len(canv.find_all())
#sposto il grafico della funzione per farlo apparire al centro
canv.yview ( SCROLL,1000, "units" )
canv.xview ( SCROLL,1333, "units" )
canv.bind("<Motion>",oncanvas)
App.mainloop()

p.s. spero non ci siano troppi errori-orrori nella programmazione (come le scrollbar, le ho modificate per far mostrare le coordinate del mouse ma cos funzionano solo con i pulsanti, non trascinate la barra)

Loading