Verbesserung meines einfachen Python-Rechners

Sep 11 2020

Ich bin ziemlich neu in Python und dies ist mein erstes Projekt, das ich selbst gemacht habe. Ich frage mich, ob es überhaupt etwas gibt, das ich verbessern oder mir Ratschläge geben kann, wie ich das verbessern kann. Danke

import sys
valid = ["+", "-", "*", "/"]
invalid = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
def start():
    while True:
        a = input("").lower()
        for banned in a:
            if banned in invalid:
                print("error")
            else:
                sum1 = int(a)
        cal = input("")
        b = input("").lower()
        for banned in b:
            if banned in invalid:
                print("Error")
                start()
            else:
                sum2 = int(b)
        break;
    for list in cal:
        if list in valid:
            if list == "+":
                total = sum1 + sum2
                print("=" + total)
            if list == "-":
                total = sum1 - sum2
                print(total)
                start()
            if list == "*":
                total = sum1 * sum2
                print(total)
                start()
            if list == "/":
                total = sum1 / sum2
                print(total)
                start()
        else:
            print("Wrong Format")
            start()
start()

Antworten

3 FMc Sep 11 2020 at 05:48

Einige Kommentare konzentrierten sich weniger auf zeilenweise Details als vielmehr darauf, wie bessere Befehlszeilenskripte erstellt und die Logik vereinfacht werden können.

Wie benutze ich dieses Programm ? Ihre input()Anrufe sagen mir nicht, was los ist. Hilfe bitte.

Benutzer genießen keine langwierigen Interaktionen mit Computern . Möchten Sie lieber eine Zahl eingeben, die Eingabetaste drücken, einen Operator eingeben, die Eingabetaste drücken, eine Zahl eingeben, die Eingabetaste drücken ... ODER einfach die verdammte Gleichung eingeben? Beispielsweise:

reply = input('Enter equation: INT OP INT: ')

Benutzer genießen wirklich keine langwierigen Interaktionen mit Computern . Mit seltenen Ausnahmen werden sinnvolle Befehlszeilenprogramme überhaupt nicht verwendet input()- oder zumindest nicht standardmäßig. Erfahren Sie mehr sys.argvund lassen Sie Ihre Benutzer Ihren Taschenrechner direkt ausführen, ohne sie zu zwingen, mit ihrem Computer die besten Freunde zu werden. So könnte eine Befehlszeilenverwendung aussehen:

$ python simple-calculator.py 32 + 10
42

Erfahren Sie mehr über die Ausnahmebehandlung . Versuchen Sie einfach, das zu tun, was Sie tun möchten - mit einem Sicherheitsnetz, anstatt eine Datenstruktur zu erstellen, die alle möglichen fehlerhaften Eingaben enthält (sehr schwierig, insbesondere wenn Sie alle denkbaren UTF-8-Eingaben berücksichtigen).

while True:
    try:
        # Each of these lines could fail. That's OK. Be optimistic!
        s1, op, s2 = reply.split()
        a = int(s1)
        b = int(s2)
        assert op in '+-*/'
        break                  # Success.
    except Exception as e:
        # The safety net.
        print('Invalid input')

Verwenden Sie Datenstrukturen, um die Logik zu vereinfachen . Wäre es nicht cool, einen Stapel if-elseSchecks loszuwerden und stattdessen einfach das zu tun, was Sie direkt tun möchten? In solchen Situationen kann häufig eine Datenstruktur hilfreich sein. Was wir brauchen, ist eine Möglichkeit, einen Operator zu nehmen und ihn dann zu verwenden, um eine Funktion mit zwei Argumenten zu erhalten, die die von uns benötigte Mathematik ausführt. Mit anderen Worten, wir benötigen eine Zuordnung zwischen Operatoren und den entsprechenden mathematischen Funktionen. Hier sind 3 Möglichkeiten, um dies zu erreichen:

import operator

def add(a, b):
    return a + b

ops = {
    '+': add,                    # Define your own functions.
    '-': lambda a, b: a - b,     # Or lambdas.
    '*': operator.mul,           # Or get them from a library.
    '/': operator.truediv,
}

# With that data structure, our code would reduce to this.
answer = ops[op](a, b)     # Wrap in try-except to catch divide by 0.
print(answer)
1 user985366 Sep 11 2020 at 00:55

Vorschlag 1

Ihre Liste ungültiger Zeichen und inPrüfungen funktioniert genauso gut wie eine Zeichenfolge, ist jedoch kürzer und besser lesbar.

invalid = 'abcdefghijklmnopqrstuvwxyz'

Gleiches gilt für das validArray von Zeichen.

Vorschlag 2

for banned in a:

bannedist ein sehr verwirrender Variablenname für diese Verwendung. Sie wissen nicht, ob es verboten ist, bis Sie es mit der invalidListe der Zeichen verglichen haben . Sie sollten lieber characteroder letteroder einen kürzeren Basisnamen wie coder verwenden x.

Vorschlag 3

a = input("").lower()

aist auch hier ein schlechter Name, da er uns nicht sagt, was es ist. Nennen Sie es lieber input1oder etwas Ähnliches und ändern Sie bes natürlich zu input2oder etwas anderem, das beschreibend ist.

Vorschlag 4

for list in cal:

listist nicht nur ein schlecht gewählter Name, der den Leser irreführt, sondern auch ein Schlüsselwort / eine Funktion in Python und sollte in keiner Situation als Variablenname verwendet werden. Ich schlage operatorals besseren Namen vor, da Sie einen Operator für Ihre Berechnung verwenden.

Vorschlag 5

Sie rufen start()nach jeder Operation an, außer +. Das sieht nach einem Fehler aus. Warum nicht für +?

Vorschlag 6

total = sum1 * sum2
print(total)

Für jeden Vorgang speichern Sie die Gesamtsumme in einer neuen Variablen und drucken sie dann aus. Sie verwenden es jedoch nur zum Drucken. Sie können das Ergebnis also auch direkt drucken, ohne es in einer Variablen zu speichern.

print(sum1 * sum2)