poprawiam mój prosty kalkulator w Pythonie
Jestem raczej nowy w Pythonie i jest to mój pierwszy projekt, który wykonałem samodzielnie. Zastanawiam się, czy mimo wszystko mogę to poprawić lub udzielić porady, jak to poprawić. Dziękuję Ci
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()
Odpowiedzi
W kilku komentarzach skupiono się mniej na szczegółach wiersz po wierszu, a bardziej na tym, jak tworzyć lepsze skrypty wiersza poleceń i upraszczać logikę.
Jak używać tego programu ? Twoje input()telefony nie mówią mi, co się dzieje. Prosimy o pomoc.
Użytkownicy nie lubią żmudnych interakcji z komputerami . Wolałbyś wpisać liczbę, nacisnąć Enter, wpisać operator, nacisnąć Enter, wpisać liczbę, nacisnąć Enter ... A może po prostu wpisać równanie? Na przykład:
reply = input('Enter equation: INT OP INT: ')
Użytkownicy naprawdę nie lubią żmudnych interakcji z komputerami . Z rzadkimi wyjątkami rozsądne programy wiersza poleceń w ogóle nie używają input()- a przynajmniej nie domyślnie. Dowiedz się o tym sys.argvi pozwól użytkownikom uruchamiać kalkulator bezpośrednio, bez zmuszania ich do bycia najlepszymi kumplami z komputerem. Oto, jak może wyglądać użycie wiersza poleceń:
$ python simple-calculator.py 32 + 10
42
Dowiedz się o obsłudze wyjątków . Zamiast grzęznąć w tworzeniu struktury danych zawierającej wszystkie możliwe złe dane wejściowe (bardzo trudne, zwłaszcza jeśli weźmiesz pod uwagę wszystkie możliwe dane wejściowe UTF-8), po prostu spróbuj zrobić to, co chcesz - z siecią bezpieczeństwa.
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')
Użyj struktur danych, aby uprościć logikę . Czy nie byłoby fajnie pozbyć się stosu if-elseczeków i zamiast tego po prostu zrobić to, co chcesz zrobić bezpośrednio? W takich sytuacjach często pomaga struktura danych. Potrzebujemy sposobu na pobranie operatora, a następnie użycie go do uzyskania 2-argumentowej funkcji, która wykona potrzebne nam obliczenia. Innymi słowy, potrzebujemy odwzorowania między operatorami i odpowiadającymi im funkcjami matematycznymi. Oto 3 sposoby, aby to osiągnąć:
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)
Sugestia 1
Twoja lista nieprawidłowych znaków i inczeków będzie działać tak samo dobrze jak ciąg, ale będzie krótsza i bardziej czytelna.
invalid = 'abcdefghijklmnopqrstuvwxyz'
To samo dotyczy validtablicy znaków.
Sugestia 2
for banned in a:
bannedto bardzo myląca nazwa zmiennej do tego zastosowania. Nie wiesz, czy jest zbanowany, dopóki nie porównasz go z invalidlistą postaci. Powinieneś raczej użyć characterlub letterlub krótszej nazwy podstawowej, takiej jak club x.
Sugestia 3
a = input("").lower()
ato również kiepska nazwa, ponieważ nie mówi nam, co to jest. Raczej nazwij to input1lub coś podobnego i oczywiście zmień bna input2coś opisowego.
Sugestia 4
for list in cal:
listto nie tylko źle dobrana nazwa, która wprowadza czytelnika w błąd, to także słowo kluczowe / funkcja w Pythonie i nie powinno być używane jako nazwa zmiennej w żadnej sytuacji. Sugeruję operatorjako lepszą nazwę, ponieważ bierzesz operatora do swoich obliczeń.
Sugestia 5
Dzwonisz start()po każdej operacji oprócz +. To wygląda na błąd. Dlaczego nie +?
Sugestia 6
total = sum1 * sum2
print(total)
Dla każdej operacji zapisujesz sumę w nowej zmiennej, a następnie drukujesz. Ale nie używasz go do niczego innego niż drukowanie, więc równie dobrze możesz wydrukować wynik bezpośrednio, bez przechowywania go w zmiennej.
print(sum1 * sum2)