Ir para o conteúdo

A procurar:

← VOLTAR
Python 03 - Estruturas de decisão

Python 03 - Estruturas de decisão

10/04/2026 · 2 minutos de leitura

Python 03 - Estruturas de decisão

Você já jogou um RPG onde o personagem escolhe entre atacar, defender ou usar magia? Ou assistiu aquela cena em Matrix em que Morpheus oferece a pílula azul ou a vermelha?

Esses momentos têm algo em comum: uma decisão que muda tudo o que acontece depois.

Na programação, é exatamente assim. Programas precisam tomar decisões o tempo todo:

  • se o jogador tem vida suficiente, pode continuar lutando;
  • se o usuário digitou a senha certa, entra no sistema;
  • se o personagem chegou ao nível 10, desbloqueia uma habilidade especial;
  • se o inimigo está com menos de 20% de vida, entra em modo berserk.

É aqui que entram as estruturas de decisão — e depois desta aula, você vai saber usá-las muito bem.


Objetivo da aula

Ao final desta aula, você será capaz de:

  • entender o que é uma estrutura de decisão e por que ela existe;
  • usar if, else e elif em Python;
  • criar condições com operadores de comparação;
  • combinar condições com operadores lógicos (and, or, not);
  • trabalhar com valores booleanos (True e False);
  • resolver problemas reais com decisões no código.

Tempo estimado: 30 minutos


O que é uma estrutura de decisão?

Uma estrutura de decisão faz o programa analisar uma condição e escolher qual caminho seguir.

O programa verifica se algo é verdadeiro ou falso e decide o que executar.

Pense no Chapéu Seletor de Harry Potter: ele avalia as características do aluno e decide em qual casa colocá-lo. Se for corajoso → Grifinória. Se for leal → Lufa-Lufa. E assim por diante.

Em Python, fazemos isso com três palavras-chave:

  • ifse
  • elsesenão
  • elifsenão, se (abreviação de else if)

O comando if

O if executa um bloco de código somente se a condição for verdadeira.

Sintaxe

if condição:
# código executado se a condição for verdadeira

Exemplo — verificando o nível do jogador

nivel = 15
if nivel >= 10:
print("Você desbloqueou a habilidade especial!")

Como ler esse código:

  • nivel >= 10 é a condição;
  • se for verdadeira, o print() é executado;
  • se for falsa, nada acontece e o programa segue em frente.

Indentação: a regra de ouro do Python

Python usa indentação (os espaços antes do código) para saber quais linhas pertencem a cada bloco.

Se você esquecer a indentação, o programa vai dar erro.

✅ Correto

nivel = 15
if nivel >= 10:
print("Habilidade desbloqueada!")

❌ Incorreto

nivel = 15
if nivel >= 10:
print("Habilidade desbloqueada!") # faltam 4 espaços!

Regra: use sempre 4 espaços para cada nível de indentação. A maioria dos editores faz isso automaticamente ao pressionar Tab.


Operadores de comparação

Para criar condições, usamos operadores que comparam valores.

Para números

Operador Significado Exemplo
== igual a vida == 100
!= diferente de fase != 1
> maior que dano > 50
< menor que mana < 20
>= maior ou igual a nivel >= 5
<= menor ou igual a tempo <= 30

Para texto (strings)

Operador Significado Exemplo
== igual a classe == "Mago"
!= diferente de item != "Espada"
in contém "fogo" in habilidade
not in não contém "veneno" not in status

Exemplos rápidos

dano = 80
if dano > 50:
print("Golpe crítico!")
classe = "Guerreiro"
if classe == "Mago":
print("Você pode usar magia.")
status = "envenenado, lento"
if "envenenado" in status:
print("Personagem está sofrendo dano por veneno.")

Usando else

O else define o que acontece quando a condição do if for falsa. Ele sempre vem depois do if e não tem condição própria.

Exemplo — verificando se o jogador sobreviveu

vida = 0
if vida > 0:
print("O personagem ainda está vivo!")
else:
print("Game Over. Tente novamente.")

O que acontece aqui:

  • se vida > 0 for verdadeiro → imprime a primeira mensagem;
  • caso contrário → cai no else e imprime a segunda.

Usando elif

E quando temos mais de duas possibilidades? É aí que o elif entra.

Pense na raridade de itens em games como Fortnite ou Diablo:

  • Cinza → Comum
  • Verde → Incomum
  • Azul → Raro
  • Roxo → Épico
  • Laranja → Lendário

Temos 5 possibilidades. Não dá para resolver só com if e else. Precisamos de vários elif.

Exemplo — classificando a raridade de um item

raridade = 4
if raridade == 5:
print("🟠 Item Lendário!")
elif raridade == 4:
print("🟣 Item Épico!")
elif raridade == 3:
print("🔵 Item Raro.")
elif raridade == 2:
print("🟢 Item Incomum.")
else:
print("⚪ Item Comum.")

Com raridade = 4, o programa imprime: 🟣 Item Épico!

Como funciona

O Python testa as condições de cima para baixo. Assim que uma delas for verdadeira, executa o bloco correspondente e ignora todo o resto.


A ordem das condições importa!

Esse é um dos erros mais comuns de iniciantes. Veja o exemplo:

✅ Correto — do mais específico para o mais geral

pontuacao = 9500
if pontuacao >= 10000:
print("Rank S — Lendário!")
elif pontuacao >= 7000:
print("Rank A — Expert!")
elif pontuacao >= 4000:
print("Rank B — Veterano.")
else:
print("Rank C — Iniciante.")

Com pontuacao = 9500, imprime: Rank A — Expert!

❌ Com problema lógico — do mais geral para o mais específico

pontuacao = 9500
if pontuacao >= 4000:
print("Rank B — Veterano.")
elif pontuacao >= 7000:
print("Rank A — Expert!")
elif pontuacao >= 10000:
print("Rank S — Lendário!")
else:
print("Rank C — Iniciante.")

Com pontuacao = 9500, imprime: Rank B — Veterano.

A primeira condição (>= 4000) já é verdadeira para 9500, então o Python nem chega a testar as outras. Coloque sempre as condições mais restritivas primeiro.


Valores booleanos: True e False

Python tem um tipo especial de dado chamado booleano, que representa apenas dois valores:

  • True → verdadeiro
  • False → falso

Esses valores aparecem o tempo todo nas estruturas de decisão.

invencivel = True
if invencivel:
print("Dano ignorado! O personagem está invencível.")
else:
print("Personagem recebeu dano.")

Dica: quando a variável já é booleana, não precisamos escrever if invencivel == True:. Apenas if invencivel: já funciona — e é considerado mais correto em Python.

# Desnecessário (mas funciona)
if invencivel == True:
print("Invencível!")
# Correto e mais elegante
if invencivel:
print("Invencível!")

Operadores lógicos

Às vezes precisamos combinar mais de uma condição. Para isso, usamos:

  • ande — todas as condições precisam ser verdadeiras
  • orou — pelo menos uma condição precisa ser verdadeira
  • notnão — inverte o valor lógico

Operador and

Use quando todas as condições precisam ser atendidas ao mesmo tempo.

# Para usar uma habilidade especial no RPG:
mana = 80
nivel = 12
if mana >= 50 and nivel >= 10:
print("Você usou Bola de Fogo!")
else:
print("Não é possível usar essa habilidade agora.")

O personagem só consegue usar a habilidade se tiver mana suficiente e for de nível alto o suficiente. As duas condições precisam ser verdadeiras.


Operador or

Use quando pelo menos uma das condições precisa ser atendida.

# Formas de entrar em uma área VIP do jogo:
tem_passe_vip = False
rank = "S"
if tem_passe_vip or rank == "S":
print("Acesso à área VIP liberado!")
else:
print("Acesso negado.")

O jogador pode entrar se tiver o passe VIP ou se for rank S. Qualquer uma das duas já é suficiente.


Operador not

Use para inverter uma condição.

em_pausa = False
if not em_pausa:
print("O jogo está rodando.")
else:
print("O jogo está pausado.")

em_pausa é False. not False vira True. Então o programa entra no if e imprime "O jogo está rodando.".


Comparando texto: maiúsculas e minúsculas importam!

Python diferencia letras maiúsculas de minúsculas nas comparações. Isso causa muita confusão!

personagem = "Link"
if personagem == "link":
print("Personagem encontrado.")
else:
print("Personagem não encontrado.")

Vai imprimir "Personagem não encontrado." porque "Link" e "link" são strings diferentes para o Python.

Dica prática: para comparar sem se preocupar com maiúsculas, use .lower() para converter tudo para minúsculas antes de comparar:

personagem = "LINK"
if personagem.lower() == "link":
print("Personagem encontrado!")

Exemplos práticos completos

Exemplo 1 — Sistema de dificuldade de um jogo

dificuldade = "dificil"
if dificuldade == "facil":
print("Inimigos com 50% de vida. Boa sorte!")
elif dificuldade == "normal":
print("Inimigos com 100% de vida. Divirta-se!")
elif dificuldade == "dificil":
print("Inimigos com 200% de vida. Você foi avisado.")
else:
print("Dificuldade desconhecida.")

Exemplo 2 — Verificando se um personagem pode equipar uma arma

classe = "Guerreiro"
nivel = 8
arma = "Machado do Caos"
if classe == "Guerreiro" and nivel >= 5:
print(f"Você equipou {arma}!")
elif classe != "Guerreiro":
print("Apenas Guerreiros podem usar essa arma.")
else:
print("Você precisa ser nível 5 ou superior.")

Exemplo 3 — Status do personagem após uma batalha

vida = 15
mana = 0
ouro = 320
if vida <= 20 and mana == 0:
print("⚠️ Situação crítica! Vida baixa e sem mana.")
elif vida <= 20:
print("❤️ Vida baixa! Vá se curar.")
elif mana == 0:
print("🔵 Sem mana! Descanse para recuperar.")
else:
print("✅ Personagem em boas condições.")

Exemplo 4 — Sistema de conquistas

inimigos_derrotados = 150
chefe_derrotado = True
mortes = 0
if inimigos_derrotados >= 100 and chefe_derrotado and mortes == 0:
print("🏆 Conquista desbloqueada: Guerreiro Implacável!")
elif chefe_derrotado and mortes == 0:
print("🥇 Conquista desbloqueada: Vitória Perfeita!")
elif chefe_derrotado:
print("⚔️ Conquista desbloqueada: Caçador de Chefes.")
else:
print("Continue jogando para desbloquear conquistas.")

Erros comuns — aprenda com eles

❌ Erro 1: usar = em vez de ==

# Errado — isso causa um SyntaxError
if vida = 0:
print("Game Over")
# Correto
if vida == 0:
print("Game Over")

= é atribuição (guarda um valor). == é comparação (verifica se são iguais).

❌ Erro 2: esquecer os dois pontos :

# Errado
if nivel >= 10
print("Level up!")
# Correto
if nivel >= 10:
print("Level up!")

❌ Erro 3: esquecer a indentação

# Errado — IndentationError
if nivel >= 10:
print("Level up!")
# Correto
if nivel >= 10:
print("Level up!")

❌ Erro 4: ordem errada nas condições

Sempre teste as condições mais específicas (valores maiores ou mais restritos) antes das mais gerais.


Fluxo mental para criar uma decisão

Quando for escrever um if, siga esse raciocínio:

  1. O que eu quero verificar? (qual é a condição?)
  2. Quais são as possibilidades? (quantos caminhos existem?)
  3. Qual condição deve ser testada primeiro? (a mais restritiva!)
  4. O que deve acontecer em cada caso? (qual código executar?)

Interagindo com o usuário

Para tornar o programa dinâmico, podemos usar input() para receber dados do usuário.

nome_personagem = input("Digite o nome do seu personagem: ")
nivel = int(input("Digite o nível do personagem: "))
if nivel >= 50:
print(f"{nome_personagem} é um veterano de elite!")
elif nivel >= 20:
print(f"{nome_personagem} está progredindo bem.")
else:
print(f"{nome_personagem} ainda está começando sua jornada.")

Importante: input() sempre retorna texto. Se quiser um número, use int() para inteiro ou float() para decimal.


Resumo da aula

Nesta aula você aprendeu que:

  • estruturas de decisão permitem que o programa escolha um caminho baseado em condições;
  • if executa um bloco quando a condição é verdadeira;
  • else executa um bloco alternativo quando a condição é falsa;
  • elif permite testar novas condições entre o if e o else;
  • operadores de comparação (==, !=, >, <, >=, <=, in, not in) constroem as condições;
  • operadores lógicos (and, or, not) combinam múltiplas condições;
  • True e False são valores booleanos usados o tempo todo em decisões;
  • a ordem das condições e a indentação são regras fundamentais do Python.

Fechamento

Com as estruturas de decisão, seus programas deixam de ser sequências fixas e passam a reagir a situações diferentes — como um game que responde às escolhas do jogador.

Na próxima aula, você vai aprender sobre estruturas de repetição, que permitirão executar blocos de código várias vezes. Combinadas com decisões, elas são a base para criar lógicas de jogo, menus, sistemas de pontuação e muito mais.


Quiz rápido

  1. Qual é a diferença entre = e == em Python?
  2. O que acontece se você esquecer a indentação dentro de um if?
  3. Quando devemos usar elif em vez de vários if separados?
  4. O operador and exige que quantas condições sejam verdadeiras?
  5. O que not True retorna?
  6. Por que a ordem das condições em um if/elif/else importa?
  7. Se uma variável booleana se chama conectado, como você escreve o if corretamente?

Gabarito do quiz

  1. = atribui um valor a uma variável; == compara dois valores.
  2. O Python lança um IndentationError e o programa não executa.
  3. Quando as condições são mutuamente exclusivas e fazem parte da mesma verificação — o elif garante que apenas um bloco seja executado.
  4. Todas — o and só retorna True quando todas as partes são verdadeiras.
  5. False — o not inverte o valor lógico.
  6. O Python testa de cima para baixo e para na primeira condição verdadeira; se a ordem estiver errada, uma condição mais genérica pode "capturar" casos que deveriam ir para outra.
  7. if conectado: — variáveis booleanas não precisam de == True.

Exercícios resolvidos

Exercício 1 — Verificando tipo de movimento em xadrez

peca = "Bispo"
if peca == "Torre":
print("A Torre se move em linha reta.")
elif peca == "Bispo":
print("O Bispo se move na diagonal.")
elif peca == "Cavalo":
print("O Cavalo se move em L.")
else:
print("Peça desconhecida.")

Exercício 2 — Sistema de temperatura de um servidor

temperatura = 85
if temperatura >= 90:
print("🔴 CRÍTICO: Desligando servidor imediatamente!")
elif temperatura >= 75:
print("🟡 ALERTA: Temperatura elevada, verificar resfriamento.")
else:
print("🟢 OK: Temperatura normal.")

Exercício 3 — Classificação de personagem por atributos

forca = 70
inteligencia = 40
agilidade = 55
if forca >= 70 and inteligencia < 50:
print("Classe recomendada: Guerreiro Bárbaro")
elif inteligencia >= 70:
print("Classe recomendada: Mago Arcano")
elif agilidade >= 70:
print("Classe recomendada: Assassino das Sombras")
else:
print("Classe recomendada: Aventureiro Genérico")

Exercícios para praticar

Qual será a saída do código abaixo?

pythoncode
energia = 30
escudo = True

if energia > 50 and escudo:
    print("Atacar!")
elif energia > 50 or escudo:
    print("Defender!")
else:
    print("Fugir!")

Resposta incorreta

Não. Para entrar no primeiro bloco, energia > 50 precisaria ser verdadeiro. Como energia é 30, essa condição é falsa — e o and exige que todas sejam verdadeiras.

Resposta certa

Correto! O primeiro if falha porque energia > 50 é falso. No elif, o or só precisa que uma seja verdadeira — e escudo é True. Então entra no elif.

Resposta incorreta

Não. O else só seria executado se nenhuma condição anterior fosse verdadeira. Como escudo é True, o elif já captura o caso.

Resposta incorreta

Não. O código está sintaticamente correto e executa normalmente.

Um jogo precisa verificar se um personagem pode usar a habilidade "Teletransporte". A regra é: o personagem precisa ser da classe "Mago" OU ter o item "Cristal Arcano", E em ambos os casos precisa ter pelo menos 60 de mana. Qual código implementa isso corretamente?

Resposta incorreta

Cuidado! Em Python, and tem precedência sobre or. Esse código seria interpretado como classe == "Mago" or (tem_cristal and mana >= 60), o que permite um Mago sem mana usar a habilidade.

Resposta certa

Correto! Os parênteses garantem que o or seja avaliado primeiro, exigindo que a condição de mana se aplique a ambos os casos.

Resposta incorreta

Não. Esse código permitiria qualquer personagem com 60 de mana usar a habilidade, independente da classe ou item.

Resposta incorreta

Essa lógica funciona, mas é redundante e desnecessariamente complexa. A opção com parênteses é mais clara e elegante.

Analise o código abaixo e diga qual mensagem será impressa:

pythoncode
pontos = 7500
vidas = 0
chefe_derrotado = True

if pontos >= 10000 and chefe_derrotado:
    print("Rank SS")
elif pontos >= 5000 and chefe_derrotado and vidas > 0:
    print("Rank S")
elif pontos >= 5000 and chefe_derrotado:
    print("Rank A")
else:
    print("Rank B")

Resposta incorreta

Não. Para Rank SS, pontos >= 10000 precisaria ser verdadeiro. 7500 não satisfaz essa condição.

Resposta incorreta

Não. Para Rank S, todas as três condições precisam ser verdadeiras: pontos >= 5000 (✅), chefe_derrotado (✅), e vidas > 0 (❌). Como vidas é 0, essa condição falha.

Resposta certa

Correto! O Rank S falha porque vidas > 0 é falso. O próximo elif exige apenas pontos >= 5000 e chefe_derrotado — ambos verdadeiros. Então imprime Rank A.

Resposta incorreta

Não. O else só executaria se nenhuma condição anterior fosse verdadeira. O terceiro elif já captura esse caso.

O código abaixo tem um bug lógico. Qual é o problema?

pythoncode
hp = 45

if hp >= 0:
    print("Vivo")
elif hp >= 50:
    print("Saudável")
elif hp >= 80:
    print("Ótimo")
else:
    print("Morto")

Resposta incorreta

Não. O else está presente e trataria o caso hp < 0. O problema é outro.

Resposta certa

Correto! hp >= 0 é verdadeiro para qualquer valor positivo de hp, então o programa sempre imprime "Vivo" e nunca chega aos outros blocos. As condições mais específicas (>= 80, >= 50) deveriam vir antes.

Resposta incorreta

Não. O operador em si não é o problema. A lógica e a ordem das condições é que estão incorretas.

Resposta incorreta

Não. Cada condição é independente e não precisa de and. O problema é a ordem em que são testadas.

Qual é a saída do código abaixo?

pythoncode
item = "Espada de Fogo"
durabilidade = 100

if "Veneno" in item and durabilidade > 50:
    print("Item mágico e resistente.")
elif "Fogo" in item and durabilidade == 100:
    print("Item elemental perfeito!")
elif "Fogo" in item:
    print("Item elemental danificado.")
else:
    print("Item comum.")

Resposta incorreta

Não. "Veneno" in "Espada de Fogo" é falso — a palavra "Veneno" não está no nome do item.

Resposta certa

Correto! O primeiro if falha porque "Veneno" não está no nome. O segundo elif verifica se "Fogo" está no nome (✅) e se a durabilidade é 100 (✅). Ambas verdadeiras, então imprime essa mensagem.

Resposta incorreta

Não. Esse elif só seria atingido se o anterior fosse falso. Como durabilidade == 100 é verdadeiro, o segundo elif já resolve o caso.

Resposta incorreta

Não. O else só executaria se nenhuma condição anterior fosse verdadeira.

Você quer escrever um código que verifica se um personagem está "furtivo". A variável furtivo já é booleana. Qual das opções abaixo é a forma MAIS correta em Python?

Resposta incorreta

Funciona, mas não é a forma idiomática do Python. Comparar uma variável booleana com == True é redundante.

Resposta incorreta

Funciona, mas é desnecessariamente complexo. Verificar != False é o mesmo que verificar se é verdadeiro, mas de forma tortuosa.

Resposta certa

Correto! Variáveis booleanas já são, por si só, uma condição. Usar if furtivo: é a forma mais clara, direta e pythonica de escrever isso.

Resposta incorreta

Isso causa um SyntaxError. Dentro de um if, nunca usamos = (atribuição). O correto seria == — ou simplesmente if furtivo:.

Qual será a saída do código abaixo?

pythoncode
nome = "Zelda"

if nome == "zelda":
    print("Princesa encontrada!")
elif nome.lower() == "zelda":
    print("Personagem identificado com normalização.")
else:
    print("Personagem não encontrado.")

Resposta incorreta

Não. Python diferencia maiúsculas de minúsculas. "Zelda" == "zelda" é falso.

Resposta certa

Correto! O primeiro if falha porque "Zelda" ≠ "zelda". No elif, nome.lower() converte "Zelda" para "zelda", e aí a comparação == "zelda" é verdadeira.

Resposta incorreta

Não. O else só executaria se nenhum if ou elif fosse verdadeiro. O elif com .lower() captura o caso.

Resposta incorreta

Não. O código está correto. .lower() é um método válido de strings em Python.

Um sistema de login de um jogo verifica usuário e senha. O código abaixo tem um problema de segurança lógico. Qual é?

pythoncode
usuario = input("Usuário: ")
senha = input("Senha: ")

if usuario == "admin" or senha == "1234":
    print("Acesso concedido.")
else:
    print("Acesso negado.")

Resposta incorreta

Não. input() funciona normalmente para qualquer texto. O problema não é técnico, é lógico.

Resposta certa

Exatamente! Com or, basta que uma das condições seja verdadeira. Alguém que digitar apenas usuario = "admin" (com qualquer senha) já teria acesso. O correto seria usar and.

Resposta incorreta

Não. O else já trata o caso de negação. O problema está no operador lógico escolhido.

Resposta incorreta

Não. Senhas são normalmente tratadas como strings. O problema é lógico, não de tipo de dado.

Qual das alternativas abaixo representa corretamente uma estrutura if/elif/else com indentação e sintaxe corretas?

Resposta incorreta

Não. Falta o : no final da linha do if. Isso causaria um SyntaxError.

Resposta incorreta

Não. O print do primeiro bloco não está indentado. Isso causaria um IndentationError.

Resposta certa

Correto! Todos os blocos têm : ao final da condição e 4 espaços de indentação. Estrutura perfeita.

Resposta incorreta

Não. Falta o : na linha do else. Isso causaria um SyntaxError.

Analise o código abaixo. O programador queria imprimir "Lendário" apenas para personagens acima do nível 90. O que será impresso com nivel = 95?

pythoncode
nivel = 95

if nivel >= 50:
    print("Veterano")
elif nivel >= 70:
    print("Elite")
elif nivel >= 90:
    print("Lendário")
else:
    print("Iniciante")

Resposta certa

Correto — mas errado para a intenção do programador! Como nivel >= 50 é testado primeiro, e 95 satisfaz essa condição, o programa imprime "Veterano" e para. As condições mais específicas (>= 70 e >= 90) nunca são testadas. Para corrigir, a ordem deveria ser: >= 90, >= 70, >= 50.

Resposta incorreta

Não. O Python para na primeira condição verdadeira. Como nivel >= 50 já é verdadeiro para 95, o programa nunca chega a testar >= 70.

Resposta incorreta

Esse seria o resultado desejado pelo programador, mas não é o que acontece. A condição >= 50 é testada primeiro e já captura o valor 95.

Resposta incorreta

Não. O else só executaria se nenhuma condição anterior fosse verdadeira. Como nivel >= 50 é verdadeiro, nunca chega ao else.

Resultado

/ 10

acertos