Seite 1 von 1
mathematische formel aus string berrechnen
Verfasst: Donnerstag 23. März 2006, 17:54
von keboo
Hallo Leute!
Ich habe verschiedenste mathematische formeln als String vorliegen:
Code: Alles auswählen
formel='a=b+c*d'
b=4.0
c=2.0
d=2.5
#Wie kann ich a berrechnen und einer Variable zuordnen?
Danke für eure Hilfe!
Lg
Johannes
Verfasst: Donnerstag 23. März 2006, 18:06
von Python 47
Warum in einen String???Du musst das ohne string machen:
...
Verfasst: Donnerstag 23. März 2006, 18:15
von keboo
Hallo!
Das Problem ist, dass die Formeln in meinem Inputfile stehen.
Deshalb liegen sie als String vor.
Danke für eure Hilfe,
Johannes
Verfasst: Donnerstag 23. März 2006, 18:15
von Leonidas
Erinnert mich irgendwie an
das Problem.
Verfasst: Donnerstag 23. März 2006, 18:37
von keboo
Werd leider nicht ganz schlau aus dieser Disukussion.
Bitte um Hilfe, wie ich das in den Griff bekommen kann.
Danke Johannes
Verfasst: Donnerstag 23. März 2006, 19:16
von Leonidas
Das geht nicht so einfach, du kannst es aber mit eval und exec versuchen.
Ansonsten zitiere ich mal aus dem von mit verlinkten Thread:
modelnine hat geschrieben:Wenn Du wirklich willst dass er 3x erkennt, dann kannst Du nicht einfach eine Python-Funktion draus machen, dann mußt Du einen eigenen kleinen Parser für den String schreiben der selbst dynamisch die Funktion draus macht.
Das bedeutet also, dass es sein kann, besonders wenn die mathematischen Formeln, dass du einen Parser schreiben musst, der die Formeln verarbeitet. Sind die ganzen Formeln denn gültige Python-Syntax? Dann wirds nämlich wesentlich einfacher und du kannst dir den Parser sparen! Wäre nicht schlecht, wenn du ein paar dieser Formeln postet, damit wir sehen was du berechnen willst.
Verfasst: Donnerstag 23. März 2006, 19:43
von keboo
Hi!
Geht es nicht irgendwie, dass ich den String in einen Befehl umwandle?
Quasi so, als ob ich den Inhalt des Strings in die Kommandozeile schreiben würde?
Danke.
Johannes
Verfasst: Donnerstag 23. März 2006, 20:17
von Leonidas
keboo hat geschrieben:Geht es nicht irgendwie, dass ich den String in einen Befehl umwandle?
Quasi so, als ob ich den Inhalt des Strings in die Kommandozeile schreiben würde?
Wie wärs damit:
Code: Alles auswählen
In [10]: eval('b+c*d', globals(), {'b' : 4, 'c' : 2, 'd' : 3})
Out[10]: 10
Wobei der erste Parameter von eval eben deine Funktion ist. eval() gibt dann den Rückgabewert der Operation aus.
Verfasst: Freitag 24. März 2006, 07:26
von jAN
mal ne andere möglichkeit...
Code: Alles auswählen
>>> formel='a=b+c*d'
>>> b=4.0
>>> c=2.0
>>> d=2.5
>>> exec formel
>>> print a
9.0
mit exec kann man python befehle, die in strings stehen ausführen...
gruß jAN
Verfasst: Freitag 24. März 2006, 11:16
von mitsuhiko
Exec bitte in seinem eigenen dict arbeiten lassen, sonst überschreibt das dir ja alles:
Code: Alles auswählen
>>> formel = "a = b + c * d"
>>> namespace = {'b': 4.0, 'c': 2.0, 'd': 2.5, '__builtins__': {}}
>>> exec formel in namespace
>>> namespace['a']
9.0
Die leeren builtins machen das ganze zwar nur theoretisch sicher, aber ein Fehler das einzubauen isses auf keinen Fall.
Verfasst: Freitag 24. März 2006, 11:29
von keboo
Danke für eure Antworten!
Genau sowas hab ich gesucht!!
lg
johannes

Verfasst: Freitag 24. März 2006, 13:37
von Joghurt
Bedenke aber, dass du Eingaben nur aus "vertrauenswürdigen Quellen" annimmst. Man kann eval auch sowas wie "import os; os.remove(r"C:\windows\system32\kernel.dll")" übergeben und das wird dann auch fleißig ausgeführt.
Merke: eval ist nicht immer das Mittel der Wahl.
Verfasst: Freitag 24. März 2006, 13:57
von jens
Man könnte die Formal erstmal auf String-Ebene bearbeiten... z.B. könnte man eine Reihe Zeichen "verbieten", wie " ", ";", ".", ":" Das dürfte für Formeln egal sein, aber Python-Code kann man dann nicht mehr so richtig schreiben... Es dürfte evtl. sogar reichen, wenn man den Punkt aussließt. Es sei denn man hat floats in den Formeln...
Verfasst: Freitag 24. März 2006, 21:28
von mitsuhiko
Joghurt hat geschrieben:Bedenke aber, dass du Eingaben nur aus "vertrauenswürdigen Quellen" annimmst. Man kann eval auch sowas wie "import os; os.remove(r"C:\windows\system32\kernel.dll")" übergeben und das wird dann auch fleißig ausgeführt.
Zumindestr das geht mit meine version nicht, was aber jetzt nicht heißt, dass die sicherer ist.
Verfasst: Freitag 24. März 2006, 23:44
von modelnine
blackbird, es geht aber:
Code: Alles auswählen
eval("__import__(\"os\").remove(r\"c:\\windows\\system32\\kernel.dll\")")
und das ist böse genug...
Wenn Du die Formeln selber bearbeiten willst, such mal nach einem etwas älteren Post von mir; ich hab da einen Parser für mathematische Syntax (der auch funktionen konnte) geschrieben; der konnte sogar noch ein bissel mehr als nur Python-Syntax (im Sinne der Klarheit der Eingabe von mathematischen Funktionen in mathematischen Symbolen, nicht im Funktionsumfang, meine Sprache war definitiv nicht turing-vollständig...!).
Vielleicht wär das was für Dich.
Verfasst: Samstag 25. März 2006, 12:38
von jens
Man könnte zusätlich Anführungszeichen in den Formeln filtern und fertig
Wo, man sollte eigentlich besser mit einer White-Liste arbeiten, also nur Zeichen erlauben, die in einer Formel zulässig sind...
Verfasst: Samstag 25. März 2006, 23:33
von mitsuhiko
modelnine hat geschrieben:blackbird, es geht aber:
Code: Alles auswählen
eval("__import__("os").remove(r"c:\\windows\\system32\\kernel.dll")")
und das ist böse genug...
Das ist ja auch nicht die Lösung, die ich vorgeschlagen habe
