Python Rechnungen

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
Donar3103
User
Beiträge: 9
Registriert: Sonntag 24. Januar 2016, 12:04

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
Zuletzt geändert von Anonymous am Sonntag 24. Januar 2016, 12:22, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Donar3103
User
Beiträge: 9
Registriert: Sonntag 24. Januar 2016, 12:04

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)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
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.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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