Expressões aritméticas, relacionais e lógicas¶
Tópicos e Objetivos¶
Ao final desse capítulo você deverá ser capaz de:
- calcular o resultado de expressões
aritméticas
relacionais
lógicas
- escrever expressões corretas usando:
operadores aritméticos
operadores lógicos
operadores relacionais
combinações desses operadores
Introdução¶
Vimos que uma parte importante do funcionamento de computadores é a sua capacidade de realizar cálculos, semelhante a uma calculadora. Antes de escrever programas, precisamos entender como essa “calculadora” funciona e treinar o seu uso até conseguirmos usá-la muito bem, ou seja, até que você consiga prever o valor devolvido pelo computador para expressões complexas. Provavelmente você vai encontrar situações que pareçam ambíguas no início e, nesses casos, sugerimos que você utilize o Python shell para verificar qual o comportamento do Python nessas situações.
Uma regra básica é que toda expressão calculada pelo computador deve sempre devolver o mesmo resultado. Por exemplo, a expressão 2 + 3 * 4
poderia devolver o valor 20
caso a soma 2+3
seja calculada antes da multiplicação.
Felizmente o Python segue as regras de precedência dos operadores que nós estamos acostumados e o resultado
devolvido é 14
. Faça um teste você mesmo digitando essa expressão no Python shell como:
>>> 2+3*4
14
Além de entender como o Python resolve as expressões aritméticas, vamos ver também nesse capítulo como trabalhar com expressões lógicas e relacionais. Vamos começar com uma revisão sobre expressões aritméticas.
Expressões aritméticas¶
Uma expressão aritmética é formada por números (chamados de operandos) e operadores. Na sua forma mais simples, uma expressão contém apenas um número. Assim, o valor da expressão com apenas um número é o próprio número. Veja o que acontece quando digitamos apenas um número na linha de comando do Python shell:
>>> 5
5
>>> 21
21
Quando uma expressão contém um operador como +
(soma), a “calculadora” deve realizar a operação usando os operandos fornecidos como no exemplo:
>>> 5 + 2
7
>>> 21 / 3
7
Podemos dizer que o Python reduz uma expressão a um valor. 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, como ela resolve uma expressão com vários operadores como 2+3*4
?
Teste o seu conhecimento¶
Procure prever o resultado das expressões respondendo essas questões antes de testá-las no Python shell.
- -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.
Q-1: 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.
Q-2: Qual o valor da expressão: 2 + 3 * (4 - 5)
Digite agora essas expressões no Python shell para conferir o resultado. Esperamos que você tenha acertado essas questões pois o Python segue as mesmas as regras para cálculo de expressões que você aprendeu nos cursos de matemática.
Erros de sintaxe
Lembre-se que o Python shell é um ambiente interativo que espera um ENTER para executar o que foi digitado na linha de comando e imprime o resultado. No caso de expressões aritméticas, uma expressão válida (mesmo que longa) é “reduzida” a um valor. Expressões inválidas geram mensagens de erro como:
>>> 2 +
File "<stdin>", line 1
2 +
^
SyntaxError: invalid syntax
Nesse exemplo, como a soma precisa de dois operandos e apenas um foi fornecido, o Python indica um erro de sintaxe (SyntaxError). Preste bastante atenção nas mensagens pois elas indicam inclusive o local provável onde o erro aconteceu.
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.
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
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.
Q-3: 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.
Q-4: 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.
Q-5: 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.
Q-6: Qual o valor da expressão: -2 ** 4
Expressões relacionais¶
Além de “fazer contas”, o Python permite comparar valores usando os seguintes operadores relacionais:
Operador |
Descrição |
Exemplo |
Resultado |
---|---|---|---|
== |
igualdade |
2 == 3 |
False |
!= |
desigualdade |
2 != 3 |
True |
> |
maior |
3 > 3 |
False |
>= |
maior ou igual |
3 >= 3 |
True |
< |
menor |
2 < 3 |
True |
<= |
menor ou igual |
4 <= 3 |
False |
Operadores relacionais comparam dois valores e o resultado pode ser False
(falso) ou True
(verdadeiro). Esse dois valores são chamados de valores booleanos em homenagem ao matemático George Boole (https://pt.wikipedia.org/wiki/George_Boole).
Assim como dizemos que as expressões aritméticas são reduzidas a um valor numérico inteiro ou real, as expressões relacionais são reduzidas a um valor booleano (ou seja, True
ou False
). As expressões relacionais podem conter expressões aritméticas, como no seguinte exemplo em Python shell:
>>> 2 + 3 == 3 + 2 * 1
True
Esse exemplo mostra que o resultado da expressão 2 + 3 == 3 + 2 * 1
é o valor booleano True
.
Isso porque a precedência dos operadores relacionais é menor que a dos operadores aritméticos, ou seja, as operações aritméticas são reduzidas primeiro, que resulta na comparação 5 == 5
, e depois a expressão relacional é reduzida (no caso o operador ==), resultando em True
.
Expressões lógicas¶
As expressões lógicas são construídas usando operadores lógicos sobre valores booleanos. A tabela a seguir mostra a precedência dos operadores lógicos usados em Python:
Operador |
Descrição |
Exemplo |
Resultado |
---|---|---|---|
|
negação lógica |
not True |
False |
|
E lógico |
True and False |
False |
|
OR lógico |
True or False |
True |
Expressões lógicas (ou booleanas) combinam valores booleanos com operadores lógicos.
O operador not
troca o valor do operando, ou seja, troca o valor booleano de True
para False
e de False
para True
.
O operador and
devolve True
apenas quando seus dois operandos são True
e devolve False
caso contrário, quando ao menos um dos operandos é False
, como mostra a tabela a seguir.
|
X = True |
X = False |
Y = True |
True |
False |
Y = False |
False |
False |
Já o operador or
devolve False
apenas quando seus dois operandos são False
e devolve True
caso contrário (quando ao menos um dos operandos é True
.
|
X = True |
X = False |
Y = True |
True |
True |
Y = False |
True |
False |
Como o resultado das comparações usando operadores relacionais é um booleano, os operadores lógicos podem ser utilizados para combinar os resultados relacionais. Por exemplo, considere x
um valor real qualquer. A expressão x >= -1 and x <= 1
pode ser usado para testar se x pertence ao intervalo [-1, 1]. Assim, para x = 0
temos que a expressão é True
pois as duas expressões relacionais se tornam verdadeiras. Mas quando x = 2
, a comparação x <= 1
se torna falsa e portanto o resultado do operador and
é False
.
Para esse caso em particular o Python permite a notação a <= x <= b
para verificar se o valor x
está no intervalo [a, b].
Embora essa notação seja mais compacta e simples de entender, observe que, se cada operador relacional for reduzido um por vez, como (a <= x) <= b
ou a <= (x <= b)
, os termos entre parênteses corresponderiam a valores booleanos que são incompatíveis com valores numéricos. Por exemplo, seja a=10
, b=20
, x=5
e a expressão (a <= x) <= b
. Nesse caso, o valor entre parênteses seria False
, resultado de (10 <= 5), e não teríamos como resolver False <= 20
dado que são valores de tipos incompatíveis para comparação.
Observe que o uso de incógnitas como a
, b
e x
em expressões é muito útil. Em computação, elementos como esses são chamados de variáveis e são objeto do próximo capítulo.
Exercícios¶
- Exercício 1:
Escreva um expressão em função de uma incógnita nota que resulte em
True
caso nota esteja no intervalo aberto (3.0, 5.0), e resulte emFalse
caso contrário.Dica
A seguinte expressão em função de nota resulta em
True
para uma nota maior ou igual a 5nota >= 5
- Exercício 2:
Um ano bissexto ocorre aproximadamente a cada 4 anos. Escreva uma expressão (em função de uma incógnita ano) que resulte em
True
caso ano seja bissexto eFalse
caso contrário. Para ser bissexto, o valor de ano precisa ser múltiplo de 4, exceto múltiplos de 100 que não são múltiplos de 400. Assim o ano de 2020 é bissexto pois satisfaz todas essas condições.Dica
Use o operador % para verificar se ano é um múltiplo de algum número, como por exemplo
ano % 4 == 0
Se ano=12, a expressão
12 % 4 == 0
resulta emTrue
pois como 12 é múltiplo de 4 o resto da divisão (12%4
) é zero.
Para saber mais¶
Leituras
Capítulo 2: Variáveis, expressões e comandos do livro Como Pensar Como um Cientista da Computação.
Expressões em Python https://docs.python.org/3/reference/expressions.html.
Valores booleanos e expressões booleanas do livro Como Pensar Como um Cientista da Computação.
Vídeos