migliorando il mio semplice calcolatore Python

Sep 11 2020

sono piuttosto nuovo in python e questo è il mio primo progetto che ho fatto da solo. Mi chiedo se c'è comunque che posso migliorarlo o darmi consigli su come farlo meglio. grazie

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()

Risposte

3 FMc Sep 11 2020 at 05:48

Alcuni commenti si sono concentrati meno sui dettagli riga per riga e più su come costruire migliori script da riga di comando e sulla semplificazione della logica.

Come si usa questo programma ? Le tue input()chiamate non mi dicono cosa sta succedendo. Aiuto per favore.

Agli utenti non piacciono le noiose interazioni con i computer . Preferiresti digitare un numero, premere Invio, digitare un operatore, premere Invio, digitare un numero, premere Invio ... O semplicemente inserire l'equazione maledetta? Per esempio:

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

Agli utenti non piacciono le interazioni noiose con i computer . Con rare eccezioni, i programmi da riga di comando sensibili non vengono utilizzati input()affatto, o almeno non per impostazione predefinita. Scopri sys.argve consenti agli utenti di eseguire direttamente la calcolatrice, senza costringerli a diventare migliori amici del proprio computer. Ecco come potrebbe apparire un utilizzo della riga di comando:

$ python simple-calculator.py 32 + 10
42

Informazioni sulla gestione delle eccezioni . Piuttosto che impantanarti nella creazione di una struttura dati contenente ogni possibile input non valido (molto difficile, soprattutto se si considerano tutti gli input UTF-8 concepibili), prova semplicemente a fare la cosa che vuoi fare - con una rete di sicurezza.

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')

Usa strutture dati per semplificare la logica . Non sarebbe bello sbarazzarsi di una pila di if-elseassegni e invece fare semplicemente la cosa che vuoi fare direttamente? In tali situazioni, una struttura dati può spesso aiutare. Ciò di cui abbiamo bisogno è un modo per prendere un operatore e quindi usarlo per ottenere una funzione a 2 argomenti che eseguirà i calcoli di cui abbiamo bisogno. In altre parole, abbiamo bisogno di una mappatura tra gli operatori e le corrispondenti funzioni matematiche. Ecco 3 modi per ottenerlo:

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

Suggerimento 1

Il tuo elenco di caratteri e incontrolli non validi funzionerà altrettanto bene come una stringa, ma sarà più breve e più leggibile.

invalid = 'abcdefghijklmnopqrstuvwxyz'

Lo stesso vale per la validmatrice di caratteri.

Suggerimento 2

for banned in a:

bannedè un nome di variabile molto confuso per questo uso. Non sai se è vietato finché non lo hai confrontato con l' invalidelenco dei personaggi. Dovresti piuttosto usare charactero lettero un nome di base più breve come co x.

Suggerimento 3

a = input("").lower()

aè anche un nome scadente qui poiché non ci dice cosa sia. Piuttosto chiamalo input1o qualcosa di simile, e ovviamente cambia bin input2o qualcos'altro che sia descrittivo.

Suggerimento 4

for list in cal:

listnon è solo un nome scelto male che inganna il lettore, è anche una parola chiave / funzione in Python e non dovrebbe essere usato come nome di variabile in nessuna situazione. Suggerisco operatorcome nome migliore dato che stai prendendo un operatore per il tuo calcolo.

Suggerimento 5

Stai chiamando start()dopo ogni operazione tranne +. Sembra un errore. Perché non per +?

Suggerimento 6

total = sum1 * sum2
print(total)

Per ogni operazione, stai salvando il totale in una nuova variabile e poi lo stampi. Ma non lo usi per nient'altro che la stampa, quindi potresti anche stampare il risultato direttamente senza memorizzarlo in una variabile.

print(sum1 * sum2)