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.
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

mathematische formel aus string berrechnen

Beitragvon keboo » Donnerstag 23. März 2006, 17:54

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

Beitragvon Python 47 » Donnerstag 23. März 2006, 18:06

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

...

Beitragvon keboo » Donnerstag 23. März 2006, 18:15

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

Danke für eure Hilfe,

Johannes
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 23. März 2006, 18:15

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

Beitragvon keboo » Donnerstag 23. März 2006, 18:37

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

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

Danke Johannes
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 23. März 2006, 19:16

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 Modvoice
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Beitragvon keboo » Donnerstag 23. März 2006, 19:43

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 23. März 2006, 20:17

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 Modvoice
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Beitragvon jAN » Freitag 24. März 2006, 07:26

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])
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Freitag 24. März 2006, 11:16

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

Beitragvon keboo » Freitag 24. März 2006, 11:29

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

lg

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

Beitragvon Joghurt » Freitag 24. März 2006, 13:37

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 24. März 2006, 13:57

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

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

Beitragvon mitsuhiko » Freitag 24. März 2006, 21:28

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:

Beitragvon modelnine » Freitag 24. März 2006, 23:44

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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]