Try except block
How could I code this in python "try except" block? I have a dictionary (key and Values) the values are integer. In a "try except" block, I am to enter keys of my choice and the value will sum up. I am exiting with my last input. With "ctrl +d" and then the program should give me the sum of the value of keys entered.
fruits = {
"mango": 4.00, "lemon": 2.00,
"orange": 3.00, "apple": 2.00,
"avocado": 2.50, "pineapple": 5.00,
"Watermelon": 6.50, "grapes": 4.5
}
price = 0
while True:
try:
n = input("Order: ")
if n in fruits:
price += fruits.get(n)
except(EOFError, KeyboardInterrupt):
print(f"Sum of inputs is: {price}")
break
That is my code above.
What is wrong with that code?
I am not getting what I want.
I do not want the program to prompt me before I quit with "control + d". I want to quit when entering my last key. Then the program would print the sum of values for me.
2 answers
-
answered 2022-05-04 11:19
Patrick Artner
Don't use exception to handle control-flow in your code. Use conditions to leave the loop.
I do not want the program to prompt me before I quit with "control + d". I want to quit when entering my last key.
is not possible - the program "loops too fast" for you to be able to quit it right when you sum up values - unless you force the program to sleep() for some time after you sum up the values:
from time import sleep fruits = {"mango": 4.00, "lemon": 2.00, "orange": 3.00, "apple": 2.00, "avocado": 2.50, "pineapple": 5.00, "watermelon": 6.50, "grapes": 4.5} cost = 0 while True: try: n = input("Order: ") if n not in fruits: print("Invalid choice.") # sum if in dict, else use 0 cost += fruits.get(n, 0) sleep(2) # force a 2 second pause _every_ time to allow Ctrl-D/C except KeyboardInterrupt: break print(f"Sum of inputs is: {cost}")
This is ugly though - the far better choice is to handle empty inputs as "I am done...":
fruits = {"mango": 4.00, "lemon": 2.00, "orange": 3.00, "apple": 2.00, "avocado": 2.50, "pineapple": 5.00, "watermelon": 6.50, "grapes": 4.5} cost = 0 print( *(f"{n} costs {p}" for n,p in fruits.items()), sep="\n") while True: n = input("Order: ") if not n: # empty string is "Falsy" - same as most empty break # iterables, 0, and some other values if n not in fruits: print("Invalid choice.") cost += fruits.get(n, 0) # add 0 if not in dict print(f"Sum of inputs is: {cost}")
to get
mango costs 4.0 lemon costs 2.0 orange costs 3.0 apple costs 2.0 avocado costs 2.5 pineapple costs 5.0 Watermelon costs 6.5 grapes costs 4.5 Order: lemon Order: water # invalid choice Invalid choice. Order: grapes Order: # empty input breaks Sum of inputs is: 6.5 # 2 + 4.5
You should not use
sum
as variable name, the name is taken by the build insum()
function.Exceptions are there to handle errors, not to steer your code's flow.
-
answered 2022-05-04 11:34
arya sianati
You can use
finally
to print the final price in the endfruits = { "mango": 4.00, "lemon": 2.00, "orange": 3.00, "apple": 2.00, "avocado": 2.50, "pineapple": 5.00, "Watermelon": 6.50, "grapes": 4.5 } price = 0 while True: try: n = input("Order: ") price += fruits[n] print("Item added.") except: print("Item is not in the list.") finally: print("Sum: " + str(price))
and also you can print empty string after printing sum for better interface
fruits = { "mango": 4.00, "lemon": 2.00, "orange": 3.00, "apple": 2.00, "avocado": 2.50, "pineapple": 5.00, "Watermelon": 6.50, "grapes": 4.5 } price = 0 while True: try: n = input("Order: ") price += fruits[n] print("Item added.") except: print("Item is not in the list.") finally: print("Sum: " + str(price)) print("")
if you want to get the sum at the end you can print it outside of
while
fruits = { "mango": 4.00, "lemon": 2.00, "orange": 3.00, "apple": 2.00, "avocado": 2.50, "pineapple": 5.00, "Watermelon": 6.50, "grapes": 4.5 } price = 0 while True: try: n = input("Order: ") price += fruits[n] print("Item added.") except: print("Item is not in the list.") break print("Sum: " + str(price))
do you know?
how many words do you know