Módulo 6 - Operadores e cálculos

Operadores lógicos: and, or e not

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Ler e montar as tabelas verdade de and, or e not.
  • Combinar duas ou mais comparações numa condição composta.
  • Entender que o or do Python é inclusivo, não exclusivo.
  • Evitar a armadilha clássica de escrever idade == 17 or 18.

Três palavras, três comportamentos

As comparações da aula passada respondem uma pergunta por vez. A vida raramente é assim. Para entrar num filme de classificação livre acompanhado, a pergunta real é dupla: tem idade suficiente OU está com responsável? Para dirigir: tem 18 anos E tem habilitação? Os operadores lógicos existem para costurar perguntas simples em perguntas compostas, e o Python os escreve como palavras mesmo: and, or e not.

Primeiro valorSegundo valorand (e)or (ou)
TrueTrueTrueTrue
TrueFalseFalseTrue
FalseTrueFalseTrue
FalseFalseFalseFalse

As tabelas verdade de and e or, lado a lado. O and só sobrevive na primeira linha; o or só cai na última.

Um jeito de nunca mais esquecer: o and é o operador exigente, que precisa de unanimidade; um único False estraga o resultado inteiro, como um ingrediente vencido estraga a receita. O or é o operador satisfeito, que aceita qualquer True; para ele dar False, é preciso que tudo falhe. E o not é o contrariador profissional: recebe uma resposta e devolve a oposta.

print(True and True)    # True
print(True and False)   # False
print(True or False)    # True
print(False or False)   # False
print(not True)         # False
print(not False)        # True

Os três operadores em estado puro. Rode no Playground e confira contra a tabela verdade.

Combinando comparações de verdade

Na prática, você quase nunca escreve True and False diretamente. Os lados do and e do or são comparações, que se resolvem primeiro (a precedência delas é maior) e entregam os True e False para o operador lógico combinar. O exemplo abaixo verifica os dois requisitos para dirigir.

idade = 19
tem_habilitacao = True

pode_dirigir = idade >= 18 and tem_habilitacao
print("Pode dirigir:", pode_dirigir)  # Pode dirigir: True

Primeiro o Python resolve idade >= 18 (True), depois combina com tem_habilitacao via and.

Dá para encadear mais de dois testes: idade >= 18 and tem_habilitacao and not carro_quebrado, por exemplo. A ordem de resolução entre os lógicos é not primeiro, and depois, or por último, mas você não precisa carregar essa tabela na memória: parênteses deixam qualquer combinação explícita, e a recomendação da aula 3 vale dobrada aqui. Expressão lógica confusa é berço de bug.

temperatura = 27
esta_chovendo = False

programa_de_praia = temperatura >= 25 and not esta_chovendo
print("Programa de praia:", programa_de_praia)  # Programa de praia: True

O not resolve primeiro (not False vira True), depois o and combina com o resultado de temperatura >= 25.

Rode esse exemplo no Playground e depois sabote-o: mude a temperatura para 20, troque esta_chovendo para True, inverta o not. Prever a saída antes de executar, e conferir se acertou, é o treino que transforma tabela verdade decorada em intuição. Duas linhas de dado, uma de lógica, e você já consegue explicar cada True e cada False que aparece.

Erros de leitura que pegam todo mundo

O maior risco dos operadores lógicos não é técnico, é de tradução. Nós usamos e e ou no dia a dia com folgas que o Python não tolera. Primeira folga: no português falado, ou costuma ser exclusivo (chá ou café significa um dos dois, não ambos). O or do Python é inclusivo: se os dois lados forem True, o resultado é True. Quem quer exatamente um dos dois precisa montar a condição com mais cuidado, e isso é raro no nível básico.

Segunda folga, e essa derruba muita gente: traduzir a idade é 17 ou 18 direto para idade == 17 or 18. Parece certo e está errado. O Python lê essa expressão como (idade == 17) or (18), e o número 18 sozinho conta como verdadeiro na avaliação lógica. Resultado: a expressão dá sempre verdadeiro, com qualquer idade, sem nenhuma mensagem de erro. O jeito certo repete a comparação dos dois lados do or.

idade = 30

# ERRADO: dá sempre um valor verdadeiro, com qualquer idade.
print(idade == 17 or 18)            # 18 (que vale como True)

# CERTO: cada lado do or é uma comparação completa.
print(idade == 17 or idade == 18)   # False

A armadilha mais famosa dos operadores lógicos. Cada lado do or precisa ser uma pergunta completa.

Feche a aula com este hábito: ao escrever uma condição composta, leia-a em voz alta trocando and por e é necessário que e or por ou basta que. Se a frase soar estranha, a condição provavelmente está errada. Na aula que vem, você coloca operadores aritméticos, comparações e lógica a serviço de um programa completo: a sua calculadora de terminal.

Teste rápido

Por que a expressão idade == 17 or 18 está errada para testar se idade é 17 ou 18?

Perguntas frequentes

Por que o Python usa palavras (and, or, not) em vez de símbolos?
Escolha deliberada de legibilidade, coerente com a filosofia da linguagem. Muitas linguagens usam && e || para as mesmas operações; o criador do Python preferiu palavras que se leem como frase. A condição idade >= 18 and tem_habilitacao dispensa tradução mental.
Posso encadear três ou mais condições com and e or?
Pode, sem limite prático: a and b and c exige tudo verdadeiro, a or b or c se satisfaz com qualquer um. Quando misturar and com or na mesma expressão, use parênteses para deixar a ordem explícita, porque o and tem prioridade sobre o or e a leitura sem parênteses engana.
Quem resolve primeiro: as comparações ou os operadores lógicos?
As comparações. Na expressão idade >= 18 and saldo > 0, o Python calcula os dois lados primeiro, obtém dois valores bool e só então aplica o and. Entre os lógicos, a ordem é not, depois and, depois or; com parênteses, você não precisa decorar isso.
O que significa dizer que o or do Python é inclusivo?
Que ele devolve True também quando os dois lados são verdadeiros, e não apenas quando um só é. No português do dia a dia, ou muitas vezes soa como um ou outro, nunca ambos; o or do código não tem essa restrição. True or True dá True, sem drama.
O not serve para quê, na prática?
Para expressar a condição pelo lado que fica mais natural de ler. Se a variável esta_chovendo guarda True ou False, a condição para um passeio ao ar livre fica not esta_chovendo, que se lê exatamente como a intenção. Sem o not, você precisaria escrever esta_chovendo == False, que funciona, mas é mais verboso.
Um número pode aparecer onde o Python espera True ou False?
Pode, e é daí que vem a armadilha do idade == 17 or 18: na avaliação lógica, o zero conta como falso e qualquer outro número conta como verdadeiro. Esse comportamento tem usos legítimos em código avançado, mas no nível básico ele aparece principalmente como fonte de bug silencioso. Prefira comparações completas e explícitas.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.