Skip to content
Advertisement

Question regarding my program being tedious

I just started learning python 3 recently and i have a problem of my code being too repetitive and lengthy.

i wrote a code to calculate the interest earned. I have read about using functions to simplify my code but i am not sure how to go about doing this.

Thanks for anyone who is willing to help me out! The code i have written is as follows:

print("Welcome to the monthly interest rate calculator")

original_interest = 0.0005/12
additional_food_interest_1 = 0.0055/12
additional_food_interest_2 = 0.0085/12
additional_interest_3 = 0.0090/12
additional_interest_4 = 0.0015/12
additional_interest_5 = 0.0095/12
additional_interest_6 = 0.0035/12

interest = [original_interest]


#asks user for the amount of money they have in the bank
while True:
    try:
        account = float(input("Enter your account balance: "))
    except ValueError:
        print("Try Again.")
        continue
    else:
        break

# checks if condition 1 is met before adding either food_interest_1 or food_interest_2 variable to the list
while True:
    try:
        food_spending = float(input("How much did you spend on food?: "))
    except ValueError:
        print("Try Again.")
        continue
    else:
        break

if food_spending >= 100 and food_spending < 200:
    interest.append(additional_food_interest_1)
elif food_spending >= 200:
        interest.append(additional_food_interest_2)
else:
    pass


# checks if condition 2 is and if so adds additional_interest_3 to the list
while True:
    try:
        drinks_spending = float(input("How much did you spend on drinks?: "))
    except ValueError:
        print("Try Again.")
        continue
    else:
        break

if drinks_spending >= 100:
    interest.append(additional_interest_3)
else:
    pass

# checks if condition 3 is met and if so adds additional_interest_4 to the list
while True:
    try:
        insurance_spending = float(input("How much did you spend on insurance?: "))
    except ValueError:
        print("Try Again.")
        continue
    else:
        break

if insurance_spending >= 100:
    interest.append(additional_interest_4)
else:
    pass


# checks if condition 4 is met and if so adds additional_interest_5 to the list
while True:
    try:
        debitcard_spending = float(input("How much did you spend on your debit card??: "))
    except ValueError:
        print("Try Again.")
        continue
    else:
        break

if  debitcard_spending >= 100:
    interest.append(additional_interest_5)
else:
    pass
        
# This checks for 4 inputs from the user and if satisfies the condition, adds additional_interest_6 to the list
        
while True:
    try:
        first_receipt = float(input("Enter the amount on your first receipt: "))
    except ValueError:
        print("Try Again.")
        continue
    else:
        break

while True:
    try:
        second_receipt = float(input("Enter the amount on your second receipt: "))
    except ValueError:
        print("Try Again.")
        continue
    else:
        break

while True:
    try:
        third_receipt = float(input("Enter the amount on your third receipt: "))
    except ValueError:
        print("Try Again.")
        continue
    else:
        break

while True:
    try:
        four_receipt = float(input("Enter the amount on your fourth receipt: "))
    except ValueError:
        print("Try Again.")
        continue
    else:
        break

if first_receipt > 20 and second_receipt > 20 and third_receipt >20 and four_receipt > 20:
    interest.append(additional_interest_6)
        
#calculates the total interest earned
if account <= 20000:
    print("your monthly interest earned is", round(account*(sum(interest)),2))
else:
    print(20000*sum(interest) + (account-20000)*original_interest)

Advertisement

Answer

This is about as concise as I can make it with a quick pass.

I refactored things so all inputs are requested first, all computation done second. Should you refactor the calculation bits into a function, that’d make the function easier to test. I also refactored the computation into a function of its own.

def prompt_float(prompt):
    while True:
        try:
            return float(input(prompt))
        except ValueError:
            print("Try Again.")


def prompt_receipts():
    receipts = []
    while True:
        receipt_value = prompt_float(
            f"Enter the amount on receipt {len(receipts) + 1}, or <= 0 for no more receipts."
        )
        if receipt_value <= 0:
            break
        receipts.append(receipt_value)
        if len(receipts) >= 4:
            break
    return receipts


def compute_interest(
    *,
    original_interest,
    receipts,
    debitcard_spending,
    drinks_spending,
    food_spending,
    insurance_spending,
):
    additional_food_interest_1 = 0.0055 / 12
    additional_food_interest_2 = 0.0085 / 12
    additional_interest_3 = 0.0090 / 12
    additional_interest_4 = 0.0015 / 12
    additional_interest_5 = 0.0095 / 12
    interest = [original_interest]
    if 100 <= food_spending < 200:
        interest.append(additional_food_interest_1)
    elif food_spending >= 200:
        interest.append(additional_food_interest_2)
    if drinks_spending >= 100:
        interest.append(additional_interest_3)
    if insurance_spending >= 100:
        interest.append(additional_interest_3)
    if debitcard_spending >= 100:
        interest.append(additional_interest_4)
    if all(receipt_value > 20 for receipt_value in receipts):
        interest.append(additional_interest_5)
    return interest


def main():
    print("Welcome to the monthly interest rate calculator")

    # Get user inputs.

    account = prompt_float("Enter your account balance: ")
    food_spending = prompt_float("How much did you spend on food?: ")
    drinks_spending = prompt_float("How much did you spend on drinks?: ")
    insurance_spending = prompt_float("How much did you spend on insurance?: ")
    debitcard_spending = prompt_float(
        "How much did you spend on your debit card??: "
    )
    receipts = prompt_receipts()

    # Compute things.

    original_interest = 0.0005 / 12
    interest = compute_interest(
        original_interest=original_interest,
        receipts=receipts,
        debitcard_spending=debitcard_spending,
        drinks_spending=drinks_spending,
        food_spending=food_spending,
        insurance_spending=insurance_spending,
    )

    # Output things.

    if account <= 20000:
        print(
            "your monthly interest earned is",
            round(account * (sum(interest)), 2),
        )
    else:
        print(20000 * sum(interest) + (account - 20000) * original_interest)


if __name__ == "__main__":
    main()

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement