Seite 1 von 1
Python Rechnungen
Verfasst: Sonntag 24. Januar 2016, 12:17
von Donar3103
Ich habe folgendes Problem:
Ich habe in Python 2.7 ein Programm geschrieben, welches eine Funktion als String einfließt, jedoch kann ich nachdem ich x durch eine Zahl ersetzt habe den String nicht in eine Zahl umwandeln. Gibt es eine einfache Methode dies zu tun, ohne des String zu zerlegen und wieder Teil für Teil zusammen zu setzten?
Code: Alles auswählen
Eingabe=str(input())
Eingabe="0.0+"+Eingabe
Liste=[]
for i in range(len(Eingabe)):
Liste=Liste+[Eingabe[i]]
for i in range(len(Liste)):
if Liste[i]=="e":
Liste[i]=2.71828182846
elif Liste[i]=="^":
Liste[i]=="**"
elif Liste[i]=="x":
if Liste[i-1][len(Liste[i-1])-1]=="*" or Liste[i-1][len(Liste[i-1])-1]=="+":
Liste[i]=8.0
else:
Liste[i]="*8.0"
Funktion=""
for i in range(len(Liste)):
Funktion=Funktion+str(Liste[i])
soweit funktioniert alles, jedoch kann ich den String nicht in eine Zahl umwandeln
Re: Python Rechnungen
Verfasst: Sonntag 24. Januar 2016, 19:21
von /me
Das sieht alles etwas merkwürdig aus. Ich nehme mir jetzt nur mal einen kleinen Bereich heraus, für den Rest fehlt mir gerade die Zeit.
Ein Teil deines Codes sieht wie folgt aus.
Code: Alles auswählen
data = []
for i in range(len(eingabe)):
data = data + [eingabe[i]]
Der Zugriff auf Elemente über den Listenindex ist in Python ein absolutes Anti-Pattern. So etwas braucht man quasi nie. Du kannst direkt über die Elemente iterieren.
Code: Alles auswählen
data = []
for character in eingabe:
data = data + [character]
Jetzt würde man zudem die append-Methode einer Liste verwenden.
Code: Alles auswählen
data = []
for character in eingabe:
data.append(character)
Das ist aber auch noch übermäßig kompliziert, denn Python besitzt die sogenannte List Comprehension.
Und selbst das ist hier noch zu komplex, denn ein Aufruf der list-Funktion bringt dir das gleiche Ergebnis.
Das für den Anfang, den Rest schaue ich - und bestimmt auch jemand anders - später noch an.
Re: Python Rechnungen
Verfasst: Sonntag 24. Januar 2016, 21:34
von Donar3103
Das ist ja schön und gut
Was aber nicht meine frage
Ich wollte nachdem ich des x durch ne zahl in meinem Bsp ne 8 ersetzt hab
Den String in ne zahl umwandeln
Der String zum Bsp: 3X+8
X ersetzt : 3*8+8
Soweit war ich auch
Den String 3*8+8 in ne zahl speichern ohne den String auseinander zu nehmen und Teil für Teil zusammenzusetzen (wie des geht weiß ich bereits, jedoch sehr viel programmier Arbeit)
Re: Python Rechnungen
Verfasst: Sonntag 24. Januar 2016, 22:54
von /me
Donar3103 hat geschrieben:Den String 3*8+8 in ne zahl speichern ohne den String auseinander zu nehmen und Teil für Teil zusammenzusetzen (wie des geht weiß ich bereits, jedoch sehr viel programmier Arbeit)
Dafür würde ich dann
SymPy verwenden. Dann brauchst du die Ersetzung von Variablen gar nicht erst selber vornehmen. Du solltest allerdings sicherstellen, dass deine Eingabe ungefährlich ist, da SymPy
eval verwendet.
eval funktioniert simpel ...
... und ist brandgefährlich:
Eval really is dangerous.
Zudem ist mir klar, dass der Fokus deiner Frage nicht auf dem lag wozu ich zuerst etwas geschrieben hatte, aber du solltest dir das trotzdem ansehen um wirklich
mit Python und nicht
gegen die Sprache zu programmieren.
Re: Python Rechnungen
Verfasst: Sonntag 24. Januar 2016, 22:59
von BlackJack
@Donar3103: In Python 2 solltest Du die Finger von `input()` lassen. Damit kann der Benutzer beliebige Python-Ausdrücke eingeben, die dann ausgewertet werden. Das ist eine Sicherheitslücke und es ist ein Albtraum bei der Fehlerbehandlung, weil man da ja letztendlich mit *jeder* nur erdenklichen Ausnahme rechnen muss.
Schau Dir mal das `sympy`-Paket an:
Code: Alles auswählen
In [20]: e = sympy.sympify('2*x+8')
In [21]: e
Out[21]: 2*x + 8
In [22]: e.subs('x', 8)
Out[22]: 24
@/me: `sympy` verwendet `eval()`? Das zerlegt die Formel doch selbst erst einmal in einen AST.
Re: Python Rechnungen
Verfasst: Montag 25. Januar 2016, 00:09
von /me
BlackJack hat geschrieben:@/me: `sympy` verwendet `eval()`? Das zerlegt die Formel doch selbst erst einmal in einen AST.
Nicht unbedingt. Aber wenn man der Einfachheit halber
sympify verwendet wird es garstig.