mathematische formel aus string berrechnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

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
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Warum in einen String???Du musst das ohne string machen:

Code: Alles auswählen

b=4.0
c=2.0
d=2.5
a=b+c*d
print a
mfg

Thomas :-)
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hallo!
Das Problem ist, dass die Formeln in meinem Inputfile stehen.
Deshalb liegen sie als String vor.

Danke für eure Hilfe,

Johannes
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Erinnert mich irgendwie an das Problem.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Werd leider nicht ganz schlau aus dieser Disukussion. :cry:

Bitte um Hilfe, wie ich das in den Griff bekommen kann.

Danke Johannes
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

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
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Danke für eure Antworten!
Genau sowas hab ich gesucht!!

lg

johannes :D
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
--- Heiko.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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 :-)
TUFKAB – the user formerly known as blackbird
Antworten