2.4. Expressões aritméticas¶
Uma expressão aritmética é formada por números (chamados de operandos) e operadores (como soma, multiplicação etc). Na sua forma mais simples, uma expressão contém apenas um número. Assim, o valor de uma expressão com apenas um número é o próprio número. É comum também chamarmos esse valor de resultado da expressão.
Veja o que acontece quando mandamos o Python imprimir apenas um número:
Activity: CodeLens 2.4.1 (cl02_exemplo_calculadora_03)
Quando uma expressão contém um operador como +
(soma), a “calculadora” deve realizar
a operação usando os operandos fornecidos como no exemplo:
Activity: CodeLens 2.4.2 (cl02_exemplo_calculador_04)
Podemos dizer que o Python reduz uma expressão a um valor (resultado da expressão). No caso de um número, não há o que ser reduzido, e o resultado é o próprio número. No caso de uma soma como 5 + 2
, os dois números são somados e reduzidos ao valor 7
. Como a calculadora (computador) só consegue reduzir um operador por vez, você saberia prever o resultado de uma expressão com vários operadores como 2 + 3 * 4
?
2.4.1. Teste o seu conhecimento¶
Procure responder prevendo o resultado das expressões antes de testá-las no Python ou em uma calculadora.
- -1
- Incorreto: existe um padrão para cálculo de expressões que é obedecido pelos computadores onde a multiplicação tem precedência sobre a adição e subtração.
- -5
- Incorreto: existe um padrão para cálculo de expressões que é obedecido pelos computadores onde a multiplicação tem precedência sobre a adição e subtração.
- 9
- Correto.
- 15
- Incorreto: existe um padrão para cálculo de expressões que é obedecido pelos computadores onde a multiplicação tem precedência sobre a adição e subtração.
cap02-043: Qual o valor da expressão: 2 + 3 * 4 - 5
- 15
- Incorreto: é necessário calcular a expressão entre parênteses primeiro.
- 9
- Incorreto: é necessário calcular a expressão entre parênteses primeiro.
- -5
- Incorreto: é necessário calcular a expressão entre parênteses primeiro.
- -1
- Correto.
cap02-044: Qual o valor da expressão: 2 + 3 * (4 - 5)
Para conferir esses resultados,
clique no botão Salvar & Executar
da ferramenta ActiveCode abaixo.
Esperamos que você tenha acertado essas questões pois o Python segue as mesmas regras para cálculo de expressões que você aprendeu nos cursos de matemática.
Observe que as expressões foram digitadas previamente para você no campo de edição do ActiveCode. Diferente do CodeLens, o ActiveCode permite que você edite o programa. Experimente modificar as expressões e tente prever os resultados, ou inclua outras linhas com prints de outras expressões.
Note ainda que você pode inclusive executar o seu programa no CodeLens, clicando no botão Mostrar em CodeLens
.
Erros de sintaxe no ActiveCode
Lembre-se que o Python é interpretado. Ao receber uma sequência de comandos (um programa) o Python tenta executar os comandos na sequência. Caso o Python não entenda um comando ou ocorra algum problema na execução (como divisão por zero), o Python para de executar e imprime uma mensagem de erro com alguma dica sobre o problema. Um tipo comum de erro é o erro de sintaxe (SyntaxError). Execute o código no ActiveCode abaixo e confira a mensagem de erro “SyntaxError: bad input on line 1”. As mensagens são, infelizmente em inglês, mas em geral dá para ver que o erro ocorreou perto da linha 1. Você pode usar o translate da Google para traduzir a mensagem para o português. Há vários problemas no código abaixo.
Procure corrigir um erro de cada vez e clique em Salvar & Executar
para ver o comportamento do Python.
Assim, para prever o resultado de uma expressão com vários operadores, além de conhecer o que cada operador faz (como soma e multiplicação), é necessário conhecer as regras de precedência dos operadores e também sua associatividade.
2.4.2. Exemplos para entender o que é precedência e associatividade¶
As regras de precedência indicam qual operador é calculado primeiro.
Por exemplo, qual o resultado da expressão 2 - 3 * 4
?
Como a multiplicação tem maior prioridade que a subtração, o produto 3 * 4
é reduzido ao valor 12
e a seguir se calcula o valor da subtração 2 - 12
, resultando em -10
.
As regras de associatividade indicam a ordem dos cálculos para operadores que tenham a mesma precedência.
Por exemplo, qual o resultado da expressão 2 - 3 + 4
?
Como a soma tem a mesma prioridade que a subtração, precisamos aplicar a regra de associatividade.
Em Python, a maioria dos operadores binários (que usam dois operandos) tem associatividade “da esquerda para a direita” (ou seja, as operações são realizadas na mesma ordem de leitura).
A expressão portanto é primeiramente reduzida a -1 + 4
resolvendo a subtração e depois reduzida ao valor 3
resolvendo a soma. Observe que, caso a soma 3 + 4
fosse calculada primeiro, o resultado final seria -5 = 2 - (3 + 4)
.
A tabela a seguir mostra a associatividade das principais operações aritméticas em Python, em ordem decrescente de precedência (da maior para a menor):
Operador |
descrição |
Associatividade |
---|---|---|
() |
parênteses |
da esquerda para a direita |
** |
potência |
da direita para a esquerda |
+, - |
positivo e negativo unário |
da direita para a esquerda |
*, /, //, % |
multiplicação , divisão, divisão inteira e resto |
da esquerda para a direita |
+, - |
soma e subtração |
da esquerda para a direita |
Observações:
- Níveis de precedência:
A tabela mostra que há grupos de operadores com o mesmo nível, como soma e subtração.
Quanto mais “alto” o nível na tabela, maior a precedência.
- Operadores com mesmo nível de precedência são resolvidos segundo a sua associatividade.
exemplo: para reduzir a expressão
12 / 2 / 3 / 4
, o Python calcula12/2
, e segue dividindo o resultado por 3 e depois por 4.
- Os operadores unários (
+
e-
) tornam explícitos o sinal do operando. experimente colocar uma sequência de operadores unários como
-+-+3
para ver o que acontece (será que resulta em erro de sintaxe?).
- Os operadores unários (
- Use parênteses caso deseje alterar a precedência ou torná-la explícita
exemplo:
12 / 2 / 3 / 4
=>0.5
exemplo:
(12 / 2) / ( 3 / 4)
=>8.0
2.4.3. Teste o seu conhecimento¶
Qual o valor resultante das seguintes expressões:
- 0
- Incorreto: A expressão é calculada da esquerda para a direita como (12 * 2) % 10
- 1
- Incorreto: A expressão é calculada da esquerda para a direita como (12 * 2) % 10
- 4
- Resposta correta.
- 2.4
- Incorreto. O operador `%` calcula o resto da divisão.
- nenhuma das alternativas anteriores
- Incorreto, ao menos uma das alternativas anteriores está correta.
cap02-047: Qual o valor da expressão: 12 * 2 % 10
- 3
- Resposta correta.
- 3.6
- Incorreto: O operador `//` faz divisão inteira.
- 14
- Incorreto: O operador `**` tem precedência maior que multiplicação e divisão.
- 14.4
- Incorreto. O operador `//` faz divisão inteira e sua precedência é menor que `**`.
- nenhuma das alternativas anteriores
- Incorreto, ao menos uma das alternativas anteriores está correta.
cap02-048: Qual o valor da expressão: 4 * 3 ** 2 // 10
- 512
- Correto: como a associatividade de `**` é da direita para esquerda, o resultado é equivalente a 2 ** (3 ** 2)
- 256
- Incorreto: veja a associatividade de `**`
- 128
- Incorreto: veja a associatividade de `**`
- 64
- Incorreto: veja a associatividade de `**`
- nenhuma das alternativas anteriores
- Incorreto, ao menos uma das alternativas anteriores está correta.
cap02-049: Qual o valor da expressão: 2 ** 3 ** 2
- é igual a (-2) ** 4
- Incorreto: verifique qual a precedência entre `**` e o `-` unário.
- é igual a -(2 ** 4)
- Correto: o operador `**` tem precedência.
- 8
- Incorreto: verifique qual a precedência entre `**` e o `-` unário.
- 16
- Incorreto: verifique qual a precedência entre `**` e o `-` unário.
cap02-0410: Qual o valor da expressão: -2 ** 4
Use o ActiveCode abaixo para testar outras expressões.
O que comentar?
É uma boa prática de computação incluir comentários no código fonte, para ajudar outros programadores que gostariam de reusar o código.
Desde o início, evite comentários redundantes como:
print( 2 + 2 ) # soma dois com dois
Um bom uso de comentários é a descrição de blocos como:
# Testes de soma print( 2 + 3 ) print( 2 + 3 + 4 )
# Testes de subtração print( 3 - 2 ) print( -3 - 2 - 5 )
Ao longo do livro, outras boas práticas de programação serão discutidas.