Kalkulator python dasar

Oct 20 2020

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

9 AryanParekh Oct 21 2020 at 04:59

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()
5 Deep_Thoughts Oct 20 2020 at 21:54

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