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.

Code: Alles auswählen

data = [character for character in eingabe]

Und selbst das ist hier noch zu komplex, denn ein Aufruf der list-Funktion bringt dir das gleiche Ergebnis.

Code: Alles auswählen

data = list(eingabe)
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 ...

Code: Alles auswählen

>>> eval('3*8+8')
32
... 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.