解析並計算簡單的數學應用題,並以整數回傳答案。
沒有運算的題目,計算結果就是題目給的數字。
What is 5?
計算結果是 5。
把兩個數字相加。
What is 5 plus 13?
計算結果是 18。
要能處理大數和負數。
現在,來進行其他三個運算。
What is 7 minus 5?
2
What is 6 multiplied by 4?
24
What is 25 divided by 5?
5
依序處理一連串的運算。
由於這些是口語敘述的應用題,請由左到右計算運算式,忽略一般慣用的運算順序。
What is 5 plus 13 plus 6?
24
What is 3 plus 2 multiplied by 3?
15(也就是說,不是 9)
解析器應該要拒絕:
有時候,你需要引發例外。這麼做時,一定要附上有意義的錯誤訊息,指出錯誤的來源。這會讓你的程式碼更容易閱讀,也對除錯大有幫助。如果你已經知道錯誤來源會是某個特定的類型,可以選擇引發其中一種內建錯誤類型,但同樣要附上有意義的訊息。
這個練習要求你使用 raise 敘述,在傳給 answer() 的問題格式錯誤或無效,或含有未知運算時「拋出」ValueError。只有當你同時 raise 這個 exception 並附上訊息,測試才會通過。
請注意:每個情境所需的訊息都不相同,即使引發的是同一個_錯誤類型_。請仔細檢查測試。
若要以訊息引發 ValueError,請把訊息寫成 exception 類型的引數:
# if the question contains an unknown operation.
raise ValueError("unknown operation")
# if the question is malformed or invalid.
raise ValueError("syntax error")
若要在特定的程式區塊中_處理_引發的錯誤,可以使用 try-except。try-except 區塊會「包住」可能導致錯誤的程式碼,把所有的例外對應到單一錯誤、多個錯誤,或處理這個問題的其他程式碼片段:
while len(equation) > 1:
try:
# The questionable/error-prone code goes here,in an indented block
# It can contain statements, loops, if-else blocks, or other executable code.
x_value, operation, y_value, *rest = equation
...
...
except:
# Code for what to do when an error gets thrown in the code above.
# This could be one error, or more complicated logging, error checking and messaging.
raise ValueError("syntax error")