Grundlegender Python-Rechner

Oct 20 2020

Ich habe einen jungen Freund von mir, der anfängt, Python in der Schule zu lernen und mich gebeten hat, ihm einen kleinen Auftrag zu geben. Ich bin in keiner Weise ein Lehrer oder ein Python-Experte, aber ich habe akzeptiert.

Zuerst dachte ich, es würde Spaß machen, mit ein bisschen Analyse für die Eingabe der Operation zu beginnen, wie zum Beispiel:

Enter your operation : 3+3

Aber es schien ein bisschen überwältigend für ihn, also haben wir vereinbart, es in drei Teile zu teilen (erste Nummer, Operand und zweite Nummer).

Ich habe ein wenig korrigiert, aber ich finde es ungeschickt und der Sinn der Übung ist es, ihm einige gute Praktiken zu zeigen.

Also hier ist mein Code:

calculate = True
while calculate:
    try:
        number1 = float(input("Enter the first number : "))
    except ValueError:
            print("Incorrect value")
            exit()
    symbol = input("Enter the operation symbol (+,-,/,*,%) : ")
    try:
        number2 = float(input("Enter the second number : "))
    except ValueError:
            print("Incorrect value")
            exit()
    operande = ["+", "-", "*", "/", "%"]
    resSentence = "Result of operation \"{} {} {}\" is :".format(number1, symbol, number2)
    if symbol not in operande:
        print("Incorrect symbol")
    elif symbol == "+":
        print(resSentence, number1 + number2)
    elif symbol == "-":
        print(resSentence, number1 - number2)
    elif symbol == "*":
        print(resSentence, number1 * number2)
    elif symbol == "/":
        print(resSentence, number1 / number2)
    elif symbol == "%":
        print(resSentence, number1 % number2)
    restart = input("Do you want to do another calcul (Y/n) ? ")
    while restart.lower() != "y" and restart.lower() != "n":
        print(restart.lower(), restart.lower(), restart.lower()=="n")
        restart = input("Please, enter \"y\" to continue or \"n\" to exit the program : ")
    if restart.lower() == "n":
        calculate = False

Ich hätte eine Schleife machen wollen, wenn sie gültig ist number1oder number2nicht, floatbis der Benutzer einen gültigen Wert eingegeben hat, aber ich habe keinen sauberen Weg gefunden, dies zu tun. Ich würde gerne Ratschläge dazu annehmen (obwohl ich weiß, dass dies keine Frage für diesen Stack Exchange ist, wäre eine gute pythonische Methode dafür cool :)).

Antworten

9 AryanParekh Oct 21 2020 at 04:59

Verwenden Sie mehr Funktionen

Sie haben eine Funktion calculate(), aber wenn Sie sehen, dass sie viel mehr als nur berechnen kann, sieht Ihr Code dadurch unangemessen klobig aus. Aber es gibt eine sehr einfache Lösung, verwenden Sie mehr Funktionen. Was wäre, wenn Ihre Hauptschleife so aussehen könnte?

while True:
    number1,number2,operand = take_input()
    result = calculate(number1,number2,operand)
    print(f"Answer : {numebr1} {operand} {number2} = {result}")
    if input("Do you want to play again? (y/n): ").lower() == 'n':
        break 

Dies erleichtert die Wartung Ihres Programms.

continue wenn ein Fehler vorliegt

try:
    number1 = float(input("Enter the first number : "))
except ValueError:
        print("Incorrect value")
        exit()

Fragen Sie sich, warum ein Programm beendet wird, wenn der Benutzer eine ungültige Eingabe eingibt. Gib ihm noch eine Chance xD

Behalten Sie eine gleichmäßige Einrückung bei

try:
    number2 = float(input("Enter the second number : "))
except ValueError:
            print("Incorrect value")
            exit()

Versuchen Sie, einen konsistenten Einzug beizubehalten, da Sie 4Leerzeichen früher verwendet haben. Es gibt keinen guten Grund, sie 8später zu verwenden. Dies kann nur Personen verwirren, die den Code später lesen.

Codelogik 1

Betrachten wir diese Beispieleingabe

Enter the first number : 1
Enter the operation symbol (+,-,/,*,%) : I like python
Enter the second number : 2
Incorrect symbol

Klar ist das symbolfalsch. Warum musste ich die zweite Nummer eingeben, um herauszufinden, dass ich bei der Eingabe der einen Fehler gemacht habe symbol? Es hätte mir sofort sagen sollen, dass mein Symbol falsch war, also hätte ich es korrigieren können.

Verschieben Sie die if symbol not in operandsAnweisung einfach so, dass sie direkt neben der Eingabe steht.

eval

Eval in Python

Dies wäre die größte Verbesserung in Ihrem Programm, da es etwa 10-15 Codezeilen in eine konvertiert.

Die eval()Funktion wertet den angegebenen Ausdruck aus. Wenn der Ausdruck eine legale Python-Anweisung ist, wird er ausgeführt.

Das kommt mir bekannt vor, bewerten wir nicht einfach einfache Ausdrücke?

Mit evalwürde Ihr Berechnungsteil so aussehen

result = eval(f"{number1}{operand}{number2}")

Beispiel, number1 = 5,number2 = 10, operand = '+'

Dies ist, was im Grunde passiert

result = eval("5+10")

Finale

Hier ist der Code mit den Verbesserungen

def take_input():
    err_msg = "Invalid input"
    operands = ['+','-','*','/','%']
    try:
        num1 = float(input("Enter number 1: "))
    except Exception:
        print(err_msg)
        return take_input()
    try:
        num2 = float(input("Enter number 2: "))
    except Exception:
        print(err_msg)
        return take_input()

    print("Operands: " + ', '.join(x for x in operands))
    try:
        operand = input("Enter operand: ")
    except Exception:
        print(err_msg)
        return take_input()

    if operand not in operands:
        print(err_msg)
        return take_input()

    return num1,num2,operand

def calculate(num1,num2,operand):
    return eval(f"{num1}{operand}{num2}")


def mainloop():
    while True:
        num1,num2,operand = take_input()
        result = calculate(num1,num2,operand)
        print(f"Answer: {result}")
        if input("Do you want to play again? (y/n): ").lower() == 'n':
            break

mainloop()
5 Deep_Thoughts Oct 20 2020 at 21:54

Dies ist eine Alternative zu Ihrem Code, etwas komplexer, aber auch besser lesbar. Ich habe es geschafft, die Loop-Sache zu machen, aber es ist ziemlich schwer zu folgen. Es tut uns leid.

running = True
# Break Things up into functions each function does one single thing

def calculate(inputOne, operand, inputTwo):
    """
    Calculates inputOne operand and inputTwo
    """

    if operand == "+":
        return inputOne + inputTwo
    elif operand == "-":
        return inputOne - inputTwo
    elif operand == "*":
        return inputOne * inputTwo
    elif operand == "/":
        return inputOne / inputTwo
    elif operand == "%":
        return inputOne % inputTwo

def askInput():
    """
    Asks for a number until a number is given checks if each one is valid
    """

    isValid = [False, False, False] # none of the numbers are validated yet
    number1, symbol, number2 = ["", "", ""]
    
    # Here is a good implementation of the loop, it is kind of complex though
    while True:
        try:
            if not isValid[0]: # Asks for number1 if it is not valid
                number1 = int(input("Enter the first number : "))
                isValid[0] = True

            if not isValid[1]: # This is added functionality because there was a loophole in your program
                symbol = input("Enter the operation symbol (+,-,/,*,%) : ") # use tuples whenever possible
                supportedOperands = ("+", "-", "/", "*", "%")

                if symbol not in supportedOperands:
                    raise ValueError

                isValid[1] = True

            if not isValid[2]: # Asks for number2 if it is not valid
                number2 = int(input("Enter the second number : "))
                isValid[2] = True
            break
        
        except ValueError:
            continue # this just restarts the whole thing
    
    return number1, symbol, number2



def continueApp():
    """
    Checks if the input to restart is valid
    """
    restart = input("Do You want to do another calculation (Y/n) ? ").lower()

    while True:
        if restart == "y":
            return True
        elif restart == "n":
            return False
        else:
            restart = input("Please, enter \"y\" to continue or \"n\" to exit the program : ").lower()

while running:

    numberOne, operand, numberTwo = askInput()
    answer = calculate(numberOne, operand, numberTwo)
    resSentence = f"Result of operation {numberOne} {operand} {numberTwo} is : {answer}"
    print(resSentence)

    if continueApp():
        pass
    else:
        running = False
exit()


Tipps:

  • Teilen Sie die Dinge in Funktionen auf:

Funktionen sind nur Container für Code, der ausgeführt werden kann, Funktionen MÜSSEN tun ONE und nur EINE Sache mehr auf Funktionen hier .

  • Bitte versuchen Sie, Ihren Code zu kommentieren. Dies erleichtert das Lesen und Bearbeiten.

Diese Funktion

def calc():
    x = 1
    y = 12
    return (((x+y)/x)**y)+(3*x+4*y) # Please don't write like this in any case

wäre viel besser mit einer Erklärung oder was los ist

def calc():
    """
    Accepts: Nothing
    Does: Adds X and Y, then divides it by X to the power of Y
          then it adds  it to X multiplied by three and 4 multiplied by Y
    Returns: integer (the result of Does) ^^^^^
    """
    x = 1
    y = 12
    return ((x+y)/x**y)+(3*x+4*y) # Again, please don't write code like this
  • Verwenden Sie f-Zeichenfolgen (dies erfordert Python 3.6 und höher)

f Saiten werden so verwendet

value = "12"
print(f"Number {value} is an example of an f string") 

# Versus

print("Number {} is an example of an f string".format(value))
  • Versuchen Sie, Ihren Code auszuräumen

Vertrauen Sie mir, dies erleichtert das Lesen und Verstehen Ihres Codes.

def calc():
    """
    Accepts: Nothing
    Does: Adds X and Y, then divides it by X to the power of Y
          then it adds  it to X multiplied by three and 4 multiplied by Y
    Returns: integer (the result of Does) ^^^^^
    """
    x = 1
    y = 12
    ans = (x + y) / (x ** y)
    ans += (3 * x) + (4 * y) # just adds ans to the right side of the operator
    return ans