Lösungsansätze für einen Taschenrechner in Python mit mehreren Operationen?
Ich möchte nun einen Taschenrechner in Python programmieren, bei dem man mehrere Operationen durchführen kann. Beispiel: "4*5+5".
Ich habe aber schon die ersten Probleme bei der Aufgabe, die einzelnen Operatoren zu extrahieren und dann mit dem restlichen Eingabestring weiterzumachen.
ex = "4*5+5"
p = [] #Variable für Zahlen
op = [] #Variable für Operationen
op_counter = -1 #Variable um Operationen zu zählen
for x in ex:
if x.isdigit() == False:
op_counter += 1
op[op_counter] = x
Das wäre meine erste Idee wie ich die Operanten rausextrahiere. Leider weiß ich nicht wie ich weiter machen soll. Ich denke dieser Weg ist etwas zu kompliziert.
Hier mein einfacher Taschenrechner:
https://www.gutefrage.net/frage/was-wuerdet-ihr-an-diesem-python-code-verbessern
ps: Tipps bitte mit Codebeispielen
2 Antworten
Das Aufspalten ("Tokenisieren", die Grundaufgabe eines Lexers) geht recht bequem mit regulären Ausdrücken: https://docs.python.org/3.8/library/re.html
Wenn dein Rechner aber korrekt sein soll ("Punkt vor Strich") und auch mit Klammern usw. umgehen muss, wird es etwas komplizierter. Da solltest du einen Parser bauen, der einen AST (eine hierarchische Baumdarstellung) des Ausdrucks erzeugt. Eine schöne Übung, aber es gibt dafür auch vorgefertigte Komponenten wie https://github.com/lark-parser/lark
Um eine Rechnung in einem String auszuführen, schreibe
eval("4*5+5")
Das würde dann 25 ergeben.
>>> eval("4*5+5")
25
Das ist einerseits richtig, andererseits ein bisschen ein fauler Trick. Kommt natürlich auf die Zielsetzung des FS an...
Ich schätze dass der FS das als Übungsbeispiel macht und lernen will, wie man sowas selber baut, statt sich den Python-Parser auszubirgen.
Wobei für arithmetische Ausdrücke ein einfacher Descend-Parser ausreicht, den Baum als intermediate über einen Tokenizer kann ich mir da ansich schenken.
Es ist ja nicht so, daß ich hier eine umfangreiche formale Grammatik habe.