Grundlegender Python-Rechner
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
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()
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