migliorando il mio semplice calcolatore Python
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
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)
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)