Kalkulator python dasar
Saya memiliki seorang teman muda yang mulai belajar Python di sekolah dan meminta saya untuk memberinya sedikit tugas. Saya sama sekali bukan seorang guru atau ahli Python, tetapi saya menerimanya.
Awalnya saya pikir akan menyenangkan untuk memulai dengan sedikit parsing untuk input operasi, seperti:
Enter your operation : 3+3
Tapi sepertinya agak berlebihan baginya jadi kami sepakat untuk memisahkannya menjadi tiga bagian (nomor pertama, operan dan nomor kedua).
Saya melakukan sedikit koreksi tetapi menurut saya itu kikuk dan inti dari latihan ini adalah untuk menunjukkan kepadanya beberapa latihan yang baik.
Jadi inilah kode saya:
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
Saya ingin melakukan perulangan jika valid number1atau number2tidak floatsampai pengguna memasukkan nilai yang valid, tetapi saya tidak menemukan cara yang bersih untuk melakukannya. Saya akan dengan senang hati menerima saran tentang ini (meskipun saya tahu ini bukan pertanyaan untuk Stack Exchange ini, cara Pythonic yang baik untuk melakukan ini akan keren :)).
Jawaban
Gunakan lebih banyak fungsi
Anda memiliki sebuah fungsi calculate(), tetapi jika Anda melihatnya melakukan lebih dari sekadar menghitung, ini membuat kode Anda terlihat sangat kikuk. Tetapi ada solusi yang sangat sederhana, gunakan lebih banyak fungsi. Bagaimana jika loop utama Anda bisa terlihat seperti
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
Ini membuatnya lebih mudah untuk mempertahankan program Anda.
continue ketika ada kesalahan
try:
number1 = float(input("Enter the first number : "))
except ValueError:
print("Incorrect value")
exit()
Tanyakan pada diri Anda sendiri, mengapa program terhenti jika pengguna memasukkan input yang tidak valid? Beri dia kesempatan lagi xD
Pertahankan lekukan yang konsisten
try:
number2 = float(input("Enter the second number : "))
except ValueError:
print("Incorrect value")
exit()
Cobalah untuk mempertahankan indentasi yang konsisten, karena Anda telah menggunakan 4spasi sebelumnya, tidak ada alasan yang baik untuk menggunakan 8nanti, ini mungkin hanya akan membingungkan orang yang membaca kode nanti.
Logika kode 1
Mari pertimbangkan masukan sampel ini
Enter the first number : 1
Enter the operation symbol (+,-,/,*,%) : I like python
Enter the second number : 2
Incorrect symbol
Jelaslah, symbolitu salah. Mengapa saya harus memasukkan angka kedua, hanya untuk mengetahui bahwa saya melakukan kesalahan saat memasukkan symbol? Itu seharusnya langsung memberi tahu saya bahwa simbol saya salah, jadi saya bisa memperbaikinya.
Pindahkan saja if symbol not in operandspernyataan tersebut sehingga berada tepat di sebelah input.
eval
Evaluasi dengan Python
Ini akan menjadi peningkatan terbesar dalam program Anda, karena program tersebut mengubah sekitar 10-15 baris kode menjadi satu.
The
eval()Fungsi mengevaluasi ekspresi tertentu, jika ungkapan adalah pernyataan Python hukum, itu akan dieksekusi.
Kedengarannya familiar, bukankah pada dasarnya kita mengevaluasi ekspresi sederhana?
Dengan menggunakan eval, bagian kalkulasi Anda akan terlihat seperti ini
result = eval(f"{number1}{operand}{number2}")
Contoh, number1 = 5,number2 = 10, operand = '+'
Inilah yang pada dasarnya terjadi
result = eval("5+10")
Terakhir
Berikut adalah kode dengan peningkatannya
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()
Ini adalah alternatif untuk kode Anda, ini sedikit lebih kompleks tetapi juga lebih mudah dibaca. Saya berhasil melakukan hal loop tetapi agak sulit untuk diikuti. Maaf.
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()
Tips:
Memecah Things menjadi beberapa fungsi:
Fungsi hanyalah wadah untuk kode yang dapat dieksekusi, fungsi HARUS melakukan SATU dan hanya SATU hal lagi tentang fungsi di sini .
Silakan Coba untuk mengomentari kode Anda, ini membuatnya lebih mudah untuk dibaca dan diedit.
Fungsi ini
def calc():
x = 1
y = 12
return (((x+y)/x)**y)+(3*x+4*y) # Please don't write like this in any case
akan jauh lebih baik dengan penjelasan atau apa yang sedang terjadi
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
Gunakan string f (ini membutuhkan python 3.6 ke atas)
string f digunakan seperti ini
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))
Cobalah untuk mengosongkan kode Anda
Percayalah, ini membuat kode Anda lebih mudah dibaca dan dipahami.
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