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,elseeelifem Python; - criar condições com operadores de comparação;
- combinar condições com operadores lógicos (
and,or,not); - trabalhar com valores booleanos (
TrueeFalse); - 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:
if→ seelse→ senãoelif→ senã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 > 0for verdadeiro → imprime a primeira mensagem; - caso contrário → cai no
elsee 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→ verdadeiroFalse→ 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:. Apenasif 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:
and→ e — todas as condições precisam ser verdadeirasor→ ou — pelo menos uma condição precisa ser verdadeiranot→ nã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:
- O que eu quero verificar? (qual é a condição?)
- Quais são as possibilidades? (quantos caminhos existem?)
- Qual condição deve ser testada primeiro? (a mais restritiva!)
- 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, useint()para inteiro oufloat()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;
ifexecuta um bloco quando a condição é verdadeira;elseexecuta um bloco alternativo quando a condição é falsa;elifpermite testar novas condições entre oife oelse;- operadores de comparação (
==,!=,>,<,>=,<=,in,not in) constroem as condições; - operadores lógicos (
and,or,not) combinam múltiplas condições; TrueeFalsesã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
- Qual é a diferença entre
=e==em Python? - O que acontece se você esquecer a indentação dentro de um
if? - Quando devemos usar
elifem vez de váriosifseparados? - O operador
andexige que quantas condições sejam verdadeiras? - O que
not Trueretorna? - Por que a ordem das condições em um
if/elif/elseimporta? - Se uma variável booleana se chama
conectado, como você escreve oifcorretamente?
Gabarito do quiz
=atribui um valor a uma variável;==compara dois valores.- O Python lança um
IndentationErrore o programa não executa. - Quando as condições são mutuamente exclusivas e fazem parte da mesma verificação — o
elifgarante que apenas um bloco seja executado. - Todas — o
andsó retornaTruequando todas as partes são verdadeiras. False— onotinverte o valor lógico.- 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.
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?
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:
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?
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?
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?
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 é?
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?
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