Analisa e avalia problemas matemáticos simples expressos em palavras, devolvendo a resposta como um número inteiro.
Os problemas sem operações resultam simplesmente no número indicado.
What is 5?
Resulta em 5.
Soma dois números.
What is 5 plus 13?
Resulta em 18.
Lida com números grandes e negativos.
Agora, efetua as outras três operações.
What is 7 minus 5?
2
What is 6 multiplied by 4?
24
What is 25 divided by 5?
5
Lida com um conjunto de operações, em sequência.
Uma vez que estes são problemas expressos em palavras, avalia a expressão da esquerda para a direita, ignorando a ordem de operações habitual.
What is 5 plus 13 plus 6?
24
What is 3 plus 2 multiplied by 3?
15 (ou seja, não 9)
O analisador sintático deve rejeitar:
Por vezes, é necessário levantar uma exceção. Quando o fazes, deves incluir sempre uma mensagem de erro significativa que indique qual é a origem do erro. Isto torna o teu código mais legível e ajuda bastante na depuração. Nas situações em que sabes que a origem do erro será de um determinado tipo, podes optar por levantar um dos tipos de erro incorporados, mas deves incluir na mesma uma mensagem significativa.
Este exercício em particular exige que uses a instrução raise para "lançar" um ValueError se a pergunta passada a answer() estiver mal formada/inválida, ou contiver uma operação desconhecida. Os testes só passam se fizeres raise da exception e incluíres também uma mensagem.
Atenção: A mensagem necessária é diferente para cada cenário, mesmo que o mesmo tipo de erro esteja a ser levantado.
Verifica os testes com atenção.
Para levantar um ValueError com uma mensagem, escreve a mensagem como argumento do tipo exception:
# if the question contains an unknown operation.
raise ValueError("unknown operation")
# if the question is malformed or invalid.
raise ValueError("syntax error")
Para tratar um erro levantado dentro de um determinado bloco de código, podes usar um try-except.
Os blocos try-except "envolvem" o código que pode potencialmente causar um erro, mapeando todas as exceções para um erro, vários erros, ou outros pedaços de código que tratam do problema:
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")
Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.