Я вижу ошибку, которая, скорее всего, навсегда сделает это l oop go в том, что вы указали неправильные значения для никелей и пенни в некоторых местах. (Зацикливание на вводе доллара немного странно, но, насколько я могу судить, это запрет, если пользователь специально не вводит отрицательное число - если вы хотите проверить на недопустимый ввод, вы также захотите проверьте входные данные, которые вообще не являются числами!)
Тот факт, что вы должны повторять один и тот же код для каждой монеты с одинаковыми значениями, повторяющимися каждый раз, делает этот тип ошибки очень простым для Подходите. Вот предложенный подход, который делает так, чтобы вы указали каждую монету только один раз (что очень легко проверить, чтобы значения были правильными):
from collections import defaultdict
from enum import Enum
from typing import Dict
class Coin(Enum):
QUARTERS = 0.25
DIMES = 0.10
NICKELS = 0.05
PENNIES = 0.01
while True:
try:
dollars = float(input("Change Owed: "))
assert dollars > 0
break
except AssertionError:
print("I can only dispense non-negative amounts of change!")
except ValueError:
print("That's not even a number!")
num_coins: Dict[Coin, int] = defaultdict(int)
for coin in Coin:
while dollars >= coin.value:
num_coins[coin] += 1
dollars -= coin.value
for coin in Coin:
print(f"{coin.name.title()}: {num_coins[coin]}")
print(f"Total coins: {sum(num_coins.values())}")
Отличная вещь в этом подходе состоит в том, что вы можете очень легко добавлять другие виды монет (например, HALF_DOLLAR = 0.50
), и код будет работать только с добавлением этой одной строки в перечисление!