poprawiam mój prosty kalkulator w Pythonie

Sep 11 2020

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

3 FMc Sep 11 2020 at 05:48

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)
1 user985366 Sep 11 2020 at 00:55

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)