簡単な数学の文章題を解析して評価し、答えを整数として返します。
演算を含まない問題は、与えられた数値がそのまま答えになります。
What is 5?
5と評価されます。
2つの数値を足し合わせます。
What is 5 plus 13?
18と評価されます。
大きな数値や負の数値も扱えるようにしましょう。
次に、残りの3つの演算を実装しましょう。
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を「投げる」必要があります。テストに合格するには、exceptionをraiseし、それにメッセージを含める必要があります。
注意: 同じ_エラーの種類_を発生させる場合でも、必要なメッセージはシナリオごとに異なります。
テストをよく確認しましょう。
メッセージ付きで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ブロックは、エラーを引き起こす可能性のあるコードを「包み込み」、すべての例外を、1つのエラーや複数のエラー、あるいは問題に対処するための別のコードに対応させます。
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")