在神祕的村莊 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")