在神秘的 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")