У містичному селі Coinholt ми стоїмо за прилавком своєї пекарні й розкладаємо свіжу партію випічки. Двері зі скрипом відчиняються, і до пекарні заходить Denara, вправна торговка, яка добре знається на якісних товарах. Після швидкої трапези вона пересуває по прилавку сяйливу монету вартістю 100 одиниць.
Ми всміхаємося, беремо монету і дивимося на загальну вартість трапези: 88 одиниць. Отже, потрібно повернути решту на 12 одиниць.
Denara вичікувально простягає руку. «Дайте мені найменше монет», - каже вона з усмішкою. «Мій гаманець уже повний, і я не хочу ризикувати і загубити їх у дорозі.»
Ми знаємо, що варіантів є кілька. «На решту в нас є Lumis (вартістю 10 одиниць), Viras (вартістю 5 одиниць) і Zenth (вартістю 2 одиниці).»
Ми швидко подумки перебираємо можливі варіанти:
«Найкращий вибір - дві монети: один Lumis і один Zenth», - кажемо ми, віддаючи їй решту.
Denara всміхається, явно вражена. «Як завжди, усе правильно.»
Визначте найменшу кількість монет, яку потрібно видати покупцеві, щоб сума їхніх значень дорівнювала потрібній сумі решти.
Іноді буває потрібно викликати виняток. Коли ми це робимо, завжди варто додати змістовне повідомлення про помилку, щоб показати, у чому джерело помилки. Це робить наш код зрозумілішим і значно допомагає з налагодженням. У ситуаціях, коли ми знаємо, що джерело помилки буде певного типу, можна викликати один із вбудованих типів помилок, але все одно варто додати змістовне повідомлення.
У цій вправі потрібно використати інструкцію raise, щоб «кинути» ValueError, коли з наданих монет не можна видати решту. Тести пройдуть лише тоді, коли ми і застосуємо raise, і додамо до exception повідомлення.
Щоб викликати ValueError з повідомленням, передайте повідомлення як аргумент до типу exception:
# example when change cannot be made with the coins passed in
raise ValueError("can't make target with given coins")
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.