Python do Zerológica de programaçãoíndice
Python para iniciantes

Python do Zero

Nove aulas encadeadas, do primeiro if a um programa completo. Cada uma com explicação, demonstração interativa, exercícios e teste rápido.

9 aulasinterativoexercícios resolvidosprojeto final jogável
Python para iniciantes

Ensinando o programa a escolher entre vários caminhos

Um if sozinho responde só a perguntas de “sim ou não”. Mas a vida real quase nunca cabe em duas respostas. Aqui você vai entender elif e else de um jeito que não esquece mais.

Aula de lógica de programação · leitura de ~7 min · nível iniciante

// o problemaDuas respostas raramente bastam

Até agora, uma decisão no seu código tinha só dois destinos. Você fazia uma pergunta que só admite “sim” ou “não”, e o programa seguia por um de dois caminhos:

decisao.py
if chovendo:
    print("Leve o guarda-chuva")
else:
    print("Pode ir tranquilo")

Isso funciona bem quando existem exatamente duas saídas. O problema aparece quando a resposta certa depende de faixas ou de várias situações diferentes. Qual camiseta vestir não é “sim ou não” — depende de quão quente está. Quanto custa um ingresso não é “sim ou não” — depende da idade da pessoa.

Para esses casos, o Python tem uma palavra no meio do caminho: elif.

// a ideia centralPense numa cascata de peneiras

Esqueça por um segundo a sintaxe. A melhor imagem mental para if / elif / else é uma cascata: imagine peneiras empilhadas, uma embaixo da outra.

Um valor é jogado no topo e começa a cair. Cada peneira faz uma pergunta. A primeira peneira que responde “sim” segura o valor ali — e ele para de cair. As peneiras de baixo nem chegam a ser usadas. Se o valor passar por todas sem ser segurado, ele cai no chão: esse chão é o else.

Por que essa imagem ajuda

Ela deixa óbvias duas coisas que confundem quase todo iniciante: (1) as perguntas são feitas de cima para baixo, em ordem; e (2) assim que uma dá certo, o resto é ignorado. Não é que o Python escolhe “a melhor” resposta — ele escolhe a primeira que der certo.

// a sintaxeAs três peças e o que cada uma faz

Uma estrutura completa tem três tipos de bloco. Repare que só o if é obrigatório:

anatomia.py
if primeira_condição:      # obrigatório — abre a cascata
    # roda se ESTA for a 1ª verdadeira
elif segunda_condição:    # opcional — pode ter quantos quiser
    # só é testada se a de cima falhou
elif terceira_condição:   # mais um degrau, se precisar
    ...
else:                     # opcional — o "chão", sem condição
    # roda quando nenhuma acima deu certo

Três detalhes que vale gravar:

🔑 Guarde isto

1. elif nunca vive sozinho — ele sempre vem depois de um if. É a junção de “else if”, ou seja, “senão, se…”.

2. Você pode ter zero, um ou vários elif.

3. O else não tem condição: ele é o “se sobrou alguma coisa, faça isto”. Por isso vem sempre por último.

// mão na massaUm exemplo: preço do ingresso por idade

Vamos sair do exemplo de notas e usar uma bilheteria. As regras são:

  • 60 anos ou mais → meia-entrada (idoso)
  • 18 anos ou mais → inteira
  • 6 anos ou mais → meia-entrada (criança)
  • abaixo disso → entrada gratuita
bilheteria.py
idade = 25

if idade >= 60:
    print("Meia-entrada (idoso)")
elif idade >= 18:
    print("Inteira")
elif idade >= 6:
    print("Meia-entrada (criança)")
else:
    print("Entrada gratuita")
saída >Inteira

Experimente você mesmo

Arraste para mudar a idade e veja qual peneira segura o valor. Repare no que acontece com as peneiras de baixo quando uma de cima já pegou.

idade >= 60Meia-entrada (idoso)
idade >= 18Inteira
idade >= 6Meia-entrada (criança)
elseEntrada gratuita
o programa imprime >Inteira

// seguindo o rastroComo o Python lê, valor por valor

A tabela abaixo mostra o caminho que o programa percorre para três idades. “Testa” significa que ele chegou a avaliar aquela linha; onde tem “—”, ele nem passou por lá.

idade>= 60>= 18>= 6resultado
70testa → ✓Meia (idoso)
25testa → ✗testa → ✓Inteira
4testa → ✗testa → ✗testa → ✗Gratuita (else)

Olhe a linha da idade 70: o programa nem pergunta “é maior que 18?”. Ele já achou a primeira resposta verdadeira e foi embora. Isso não é preguiça — é o comportamento que economiza trabalho e evita confusão.

// o pulo do gatoPor que a ordem muda tudo

Aqui está a parte que mais gera bug em quem está começando. Repare que no código eu escrevi elif idade >= 18, e não algo como 18 <= idade < 60. Por quê?

Porque quando o Python chega naquele elif, ele já sabe que a linha de cima falhou. Se a idade fosse 60 ou mais, o valor teria sido segurado lá em cima e nem chegaria aqui. Então, ao pisar no segundo degrau, o programa já tem certeza de que a idade é menor que 60 — basta perguntar se é maior ou igual a 18.

A regra prática

Quando as condições são faixas de números, vá da mais restrita para a mais ampla (ou do maior limite para o menor). Cada elif aproveita tudo que já foi descartado acima dele.

Veja o que acontece se você inverter e colocar a peneira mais “larga” em cima:

ordem_errada.py
# ⚠️ ordem trocada de propósito
idade = 70

if idade >= 6:                 # quase todo mundo cai aqui!
    print("Meia-entrada (criança)")
elif idade >= 18:
    print("Inteira")
elif idade >= 60:
    print("Meia-entrada (idoso)")
saída >Meia-entrada (criança)

Uma pessoa de 70 anos vira “criança” — não porque a conta está errada, mas porque idade >= 6 é a primeira verdadeira, e a cascata para no primeiro “sim”. As duas peneiras de baixo nunca serão alcançadas por ninguém.

// além dos númeroselif não é só para faixas

As condições de um elif podem ser qualquer pergunta de verdadeiro/falso — inclusive comparar textos com ==. Um semáforo, por exemplo:

semaforo.py
cor = "amarelo"

if cor == "verde":
    print("Pode seguir")
elif cor == "amarelo":
    print("Atenção, reduza")
elif cor == "vermelho":
    print("Pare")
else:
    print("Cor inválida")
saída >Atenção, reduza

Aqui o else tem um papel muito útil: ele captura qualquer coisa que você não previu — um texto digitado errado, um valor inesperado. É a sua rede de segurança.

// mais um exemploFaixas no sentido crescente

No ingresso, as faixas iam do maior para o menor. Mas às vezes é mais natural ir do menor para o maior — e a cascata funciona igualzinho. Uma saudação que depende da hora do dia:

saudacao.py
hora = 14

if hora < 12:
    print("Bom dia")
elif hora < 18:
    print("Boa tarde")
else:
    print("Boa noite")
saída >Boa tarde

Repare a beleza da cascata aqui: o segundo teste é só hora < 18, e não 12 <= hora < 18. Como o programa só chega nesse elif quando o hora < 12 já falhou, ele já sabe que são 12h ou mais. Você escreve menos e o código fica mais claro — de novo, a ordem trabalhando a seu favor.

// erros comunsTrês armadilhas para evitar

1. Usar vários if soltos no lugar de elif

Se você troca os elif por if separados, cada um é testado de forma independente — a cascata deixa de existir e mais de um bloco pode rodar. Use elif quando as opções são alternativas mutuamente exclusivas (só uma deve valer).

2. Colocar a condição mais ampla em cima

Como vimos no semáforo dos números: a peneira mais “larga” engole todo mundo antes das outras serem testadas. Ordene das mais específicas para as mais gerais.

3. Tentar dar uma condição para o else

Escrever else idade < 6: dá erro. O else é o “resto” — ele não pergunta nada. Se você precisa testar mais uma coisa, o que você quer é outro elif.

// pratiqueCinco exercícios (com solução)

01 Sinal do número

Dado numero = -4, escreva uma estrutura que imprime “positivo”, “negativo” ou “zero”.

Ver solução
sol_01.py
numero = -4

if numero > 0:
    print("positivo")
elif numero < 0:
    print("negativo")
else:
    print("zero")   # sobrou só o caso == 0

Repare que o else cobre exatamente o caso “zero” sem precisar testá-lo: se não é maior nem menor que 0, só resta ser 0.

02 Multa por velocidade

A via tem limite de 80 km/h. Dada uma velocidade, imprima: “dentro do limite” (até 80), “multa leve” (81 a 100), “multa grave” (acima de 100). Pense bem na ordem.

Ver solução
sol_02.py
velocidade = 95

if velocidade > 100:
    print("multa grave")
elif velocidade > 80:
    print("multa leve")
else:
    print("dentro do limite")

Testando o maior limite primeiro (> 100), quando chegamos no > 80 já sabemos que a velocidade é no máximo 100 — não precisa escrever 80 < v <= 100.

03 Conceito da prova

Desafio: dada uma nota de 0 a 100, imprima o conceito — A (90+), B (75+), C (60+), D (abaixo de 60). Monte a cascata inteira sozinho.

Ver solução
sol_03.py
nota = 78

if nota >= 90:
    print("A")
elif nota >= 75:
    print("B")
elif nota >= 60:
    print("C")
else:
    print("D")

Mesma lógica de cascata: do limite mais alto para o mais baixo, e o else recolhe todo mundo que ficou abaixo de 60.

04 Desconto por quantidade

Numa loja, o desconto depende de quantas peças o cliente compra: 20% para 100 ou mais, 10% para 50 ou mais, 5% para 10 ou mais, e 0% abaixo disso. Dada a variável quantidade, imprima o percentual.

Ver solução
sol_04.py
quantidade = 60

if quantidade >= 100:
    print("20% de desconto")
elif quantidade >= 50:
    print("10% de desconto")
elif quantidade >= 10:
    print("5% de desconto")
else:
    print("sem desconto")

Mais uma cascata de maior para menor. Com quantidade = 60, o primeiro teste falha e o segundo pega: sai “10% de desconto”.

05 Desafio: conserte o bug

Este código de níveis de jogador está fazendo todo mundo virar “bronze”, mesmo com muitos pontos. Descubra por quê e conserte.

bug.py
# pontos = 950 deveria dar "ouro"...
pontos = 950

if pontos >= 100:
    print("bronze")
elif pontos >= 500:
    print("prata")
elif pontos >= 900:
    print("ouro")
Ver solução

O problema é a ordem. Como pontos >= 100 está no topo, qualquer pessoa com 100 pontos ou mais já é “segurada” ali e vira “bronze”. As linhas de baixo nunca são alcançadas. A correção é ir do maior limite para o menor:

sol_05.py
pontos = 950

if pontos >= 900:
    print("ouro")
elif pontos >= 500:
    print("prata")
elif pontos >= 100:
    print("bronze")

// teste rápidoConsegue prever a saída?

Leia cada trecho e escolha o que ele imprime. Clique numa opção para conferir na hora.

// para levarResumo em cinco frases

  • if abre a decisão; elif adiciona novos caminhos no meio; else é o chão que pega o resto.
  • O Python testa de cima para baixo e para no primeiro verdadeiro que encontrar.
  • Cada elif já assume que tudo acima falhou — por isso a ordem importa tanto.
  • O else não tem condição: ele é a rede de segurança para o que você não previu.
  • Para faixas de números, ordene da mais restrita para a mais ampla.

No próximo passo

Como juntar duas perguntas numa condição só, usando and (e) e or (ou).

↑ voltar ao índice
Python para iniciantes · aula 2

Juntando perguntas numa condição só: and, or e not

Até agora cada condição fazia uma única pergunta. Mas e quando a decisão depende de duas coisas ao mesmo tempo — ou de pelo menos uma delas? É para isso que existem os operadores lógicos.

Aula de lógica de programação · leitura de ~7 min · continuação de “if, elif e else”

// o problemaUma pergunta só nem sempre basta

Imagine a tela de login de um site. Para deixar a pessoa entrar, não basta o usuário estar certo — a senha também precisa estar. São duas condições que têm que valer juntas.

Com o que você já sabe, dava para resolver com um if dentro do outro. Funciona, mas fica pesado. Existe um jeito mais direto de dizer “isto e aquilo” ou “isto ou aquilo” numa linha só.

// a ideia centralPortões em série e em paralelo

Pense na sua condição como um caminho com portões:

and são portões em série, um atrás do outro. Para passar, você precisa abrir todos. Se um só estiver trancado, você não passa.

or são portões em paralelo, lado a lado. Basta um estar aberto para você passar.

not é o inverte-tudo: pega um valor verdadeiro e devolve falso, e vice-versa.

Resumo em uma frase

and → exige todas. or → aceita qualquer uma. not → troca o verdadeiro pelo falso.

// o operador andAs duas coisas precisam ser verdade

O login com and:

login.py
usuario = "joao"
senha = "1234"

if usuario == "joao" and senha == "1234":
    print("Acesso liberado")
else:
    print("Dados incorretos")
saída >Acesso liberado

O and só resulta em verdadeiro quando os dois lados são verdadeiros. Basta um errar e o resultado inteiro vira falso — cai no else.

// o operador orBasta uma delas ser verdade

Agora um caso de or: um cliente ganha frete grátis se for a primeira compra ou se for cliente VIP. Qualquer um dos dois já basta.

frete.py
primeira_compra = False
cliente_vip = True

if primeira_compra or cliente_vip:
    print("Frete grátis")
else:
    print("Frete normal")
saída >Frete grátis

O or só dá falso quando os dois lados são falsos. Se pelo menos um for verdadeiro, o resultado é verdadeiro.

// o operador notInverter uma resposta

O not vira a resposta do avesso. É útil para dizer “se não for tal coisa”:

garagem.py
chovendo = False

if not chovendo:
    print("Pode lavar o carro")
saída >Pode lavar o carro

Como chovendo é False, o not transforma em True e o bloco roda.

// experimenteA tabela verdade, ao vivo

Ligue e desligue as duas condições abaixo e veja como cada operador responde na hora. Repare que and só fica verde com as duas ligadas, enquanto or já fica verde com uma só.

A and B
A or B
not A

// tabelaTodas as combinações de uma vez

Se preferir enxergar tudo junto, esta é a “tabela verdade” de and e or. V = verdadeiro, F = falso:

ABA and BA or B
VVVV
VFFV
FVFV
FFFF

Um jeito de memorizar: and é exigente (só a primeira linha passa); or é generoso (só a última reprova).

// conexão com a aula anteriorTestar se um valor está entre dois limites

Lembra do sistema de notas, onde “recuperação” era de 5 a 7? Com and dá para dizer isso diretamente: a nota precisa ser maior ou igual a 5 e menor que 7.

faixa.py
nota = 6

if nota >= 5 and nota < 7:
    print("Em recuperação")
saída >Em recuperação
Curiosidade útil do Python

O Python ainda deixa você escrever essa faixa de um jeito bem parecido com a matemática: if 5 <= nota < 7:. Isso é o mesmo que o and acima. Poucas linguagens permitem isso — aproveite.

// erros comunsTrês armadilhas para evitar

1. Esquecer de repetir a variável

Escrever if idade > 12 and < 18: dá erro. Cada lado do and precisa ser uma comparação completa: if idade > 12 and idade < 18:.

2. Comparar com uma lista de valores usando or errado

Para checar se a cor é verde ou amarelo, o intuitivo if cor == "verde" or "amarelo": está errado — ele é sempre verdadeiro. O certo é repetir a comparação: if cor == "verde" or cor == "amarelo": (ou, mais elegante, if cor in ("verde", "amarelo"):).

3. Trocar and por or (e vice-versa)

“Preciso das duas coisas” é and. “Qualquer uma serve” é or. Trocar um pelo outro não dá erro de execução — o programa roda, mas decide errado. É o tipo de bug mais chato de achar, então leia a condição em voz alta: “isto e aquilo” ou “isto ou aquilo”?

// pratiqueQuatro exercícios (com solução)

01 Maior de idade com carteira

Uma pessoa só pode dirigir se tiver 18 anos ou mais e possuir carteira. Dadas idade e tem_carteira (True/False), imprima “pode dirigir” ou “não pode”.

Ver solução
sol_01.py
idade = 20
tem_carteira = True

if idade >= 18 and tem_carteira:
    print("pode dirigir")
else:
    print("não pode")

02 Fim de semana

Dada uma variável dia com o nome do dia, imprima “descanso” se for “sábado” ou “domingo”, e “trabalho” caso contrário.

Ver solução
sol_02.py
dia = "sábado"

if dia == "sábado" or dia == "domingo":
    print("descanso")
else:
    print("trabalho")

Lembre da armadilha: precisa repetir dia == nos dois lados do or.

03 Temperatura agradável

Considere agradável uma temperatura entre 18 e 26 graus (incluindo as pontas). Dada temp, imprima “agradável” ou “desconfortável”.

Ver solução
sol_03.py
temp = 22

if temp >= 18 and temp <= 26:
    print("agradável")
else:
    print("desconfortável")

No Python você também pode escrever if 18 <= temp <= 26: — dá exatamente no mesmo.

04 Desafio: entrada da festa

Uma pessoa entra na festa se for maior de 18 e (tiver convite ou estiver na lista VIP). Combine and e or com parênteses.

Ver solução
sol_04.py
idade = 25
tem_convite = False
na_lista_vip = True

if idade >= 18 and (tem_convite or na_lista_vip):
    print("pode entrar")
else:
    print("barrado")

Os parênteses importam: eles garantem que “convite ou VIP” seja avaliado como um bloco só, e depois combinado com a idade pelo and. Sem eles, a leitura pode mudar — na dúvida, use parênteses para deixar a intenção clara.

// teste rápidoConsegue prever a saída?

Leia cada trecho e escolha o que ele imprime. Clique numa opção para conferir na hora.

// para levarResumo em cinco frases

  • and só é verdadeiro quando as duas partes são verdadeiras (portões em série).
  • or é verdadeiro quando pelo menos uma parte é verdadeira (portões em paralelo).
  • not inverte: transforma verdadeiro em falso e falso em verdadeiro.
  • Cada lado de um and/or precisa ser uma comparação completa (repita a variável).
  • Use parênteses ao misturar and e or para deixar a intenção clara.

No próximo passo

Repetir ações sem copiar e colar código: o laço while.

↑ voltar ao índice
Python para iniciantes · aula 3

Repetir enquanto for verdade: o laço while

Até agora seu código rodava de cima a baixo, uma vez só. O while é o primeiro jeito de fazer o programa repetir um trecho quantas vezes for preciso — sem copiar e colar.

Aula de lógica de programação · leitura de ~8 min · continuação de “and, or e not”

// o problemaCopiar e colar não escala

Suponha que você queira imprimir os números de 1 a 5. Dá para fazer na força bruta:

forca_bruta.py
print(1)
print(2)
print(3)
print(4)
print(5)

Funciona para 5. Mas e para 1000? Ou quando você não sabe de antemão quantas vezes vai precisar — como “peça a senha até a pessoa acertar”? É aí que entra a repetição.

// a ideia centralUm if que não desiste

A melhor forma de entender o while é pensar nele como um if teimoso. Um if comum pergunta uma vez e, se for verdade, roda o bloco uma vez. O while pergunta, roda o bloco, e então volta e pergunta de novo — repetindo enquanto a resposta continuar sendo verdadeira.

Ele só para quando a pergunta finalmente responde “não” (falso). A tradução literal ajuda: while quer dizer “enquanto”.

O ciclo do while

1) testa a condição · 2) se for verdadeira, roda o bloco · 3) volta ao passo 1. Quando a condição for falsa, o laço termina e o programa segue em frente.

// a sintaxeOs três ingredientes de todo while

Quase todo while bem-feito tem três partes. Veja o contador de 1 a 5:

contador.py
i = 1                 # 1. começo: prepara a variável

while i <= 5:          # 2. condição: repita enquanto isto for verdade
    print(i)
    i = i + 1         # 3. avanço: muda a variável rumo ao fim
saída >1 2 3 4 5
🔑 A parte que todo iniciante esquece

O passo 3, o avanço (i = i + 1, que também se escreve i += 1), é o que garante que a condição um dia vire falsa. Sem ele, o laço nunca para. Guarde: a variável do teste precisa mudar dentro do laço.

// passo a passoRode o laço com as suas mãos

Aqui está o mesmo contador, mas você controla cada volta. Clique em “Executar uma volta” e acompanhe: o Python testa a condição, e só roda o print se ela for verdadeira.

i = 1 voltas: 0
i <= 5  ?
SAÍDA

Repare no momento em que i chega a 6: a condição i <= 5 vira falsa, o bloco não roda mais e o laço termina. É exatamente assim que o Python decide parar.

// seguindo o rastroO que acontece em cada volta

voltai antesi <= 5 ?imprimei depois
11V12
22V23
33V34
44V45
55V56
6Ffim

// o perigoO laço infinito

Se você esquecer o avanço, a condição nunca muda e o programa fica preso para sempre — travando a tela (foi mais ou menos isso que aconteceu quando “tudo travou”, lembra?).

cuidado.py
# ⚠️ NÃO rode isto: laço infinito
i = 1
while i <= 5:
    print(i)
    # faltou o i += 1 → i é sempre 1 → nunca para
Como não cair nessa

Toda vez que escrever um while, faça esta pergunta: “o que aqui dentro vai fazer a condição virar falsa um dia?” Se você não souber responder, provavelmente criou um laço infinito. E se travar de verdade, no terminal é Ctrl+C que interrompe.

// uso realRepetir sem saber quantas vezes

A força do while aparece quando você não sabe o número de repetições. Pedir a senha até acertar:

senha.py
senha = ""

while senha != "1234":
    senha = input("Digite a senha: ")

print("Acesso liberado")

Enquanto a senha estiver errada, o laço repete e pede de novo. No instante em que a pessoa digita “1234”, a condição vira falsa e o programa segue. Você não precisou saber quantas tentativas ela levaria.

// saindo no meioO comando break

Às vezes você quer repetir “para sempre” e só sair quando algo acontecer. O break interrompe o laço na hora, de dentro dele:

menu.py
while True:                       # repete indefinidamente
    opcao = input("Continuar? (s/n) ")
    if opcao == "n":
        break                    # sai do laço imediatamente

print("Programa encerrado")

while True: sozinho seria um laço infinito de propósito — o break é a saída de emergência que você mesmo controla.

// teste rápidoConsegue prever a saída?

Leia cada trecho e escolha o resultado. Cuidado com os laços infinitos!

// pratiqueQuatro exercícios (com solução)

01 Contar até 10

Use um while para imprimir os números de 1 a 10, um por linha.

Ver solução
sol_01.py
i = 1
while i <= 10:
    print(i)
    i += 1

02 Soma de 1 a 100

Some todos os números de 1 até 100 e imprima o total no fim. Dica: guarde o resultado numa variável “acumuladora”.

Ver solução
sol_02.py
soma = 0
i = 1
while i <= 100:
    soma = soma + i
    i += 1
print(soma)     # 5050

A cada volta, soma vai acumulando o valor de i. No fim, ela guarda o total.

03 Contagem regressiva

Imprima de 10 até 1 (nessa ordem) e, ao terminar, imprima “Fim!”.

Ver solução
sol_03.py
i = 10
while i >= 1:
    print(i)
    i -= 1     # agora diminui!
print("Fim!")

Como você quer descer, o avanço vira i -= 1 e a condição é i >= 1. Trocar o sentido do avanço é o erro clássico aqui.

04 Desafio: só aceita número positivo

Peça um número ao usuário e continue pedindo enquanto ele digitar um valor negativo ou zero. Quando vier um positivo, imprima “Obrigado!”.

Ver solução
sol_04.py
numero = int(input("Digite um positivo: "))

while numero <= 0:
    numero = int(input("Inválido. Tente de novo: "))

print("Obrigado!")

Pedimos uma vez antes do laço para ter o que testar. Se já vier positivo, o laço nem roda — se não, ele repete até vir um número válido.

// para levarResumo em cinco frases

  • while repete um bloco enquanto a condição for verdadeira — é um “if que não desiste”.
  • O ciclo é: testa → roda → volta a testar, até a condição virar falsa.
  • Quase todo while tem começo, condição e avanço (a variável que muda dentro do laço).
  • Esquecer o avanço cria um laço infinito que trava o programa (Ctrl+C interrompe).
  • break sai do laço na hora — útil com while True quando você controla a saída.

No próximo passo

Quando você já sabe quantas vezes repetir: o laço for e o range.

↑ voltar ao índice
Python para iniciantes · aula 4

Repetir para cada item: o laço for e o range

O while é ótimo quando você não sabe quantas voltas vai dar. Quando você já sabe — ou quer percorrer item por item de uma coleção — o for é mais curto, mais claro e nunca vira laço infinito.

Aula de lógica de programação · leitura de ~8 min · continuação de “o laço while”

// o problemaQuando o while fica repetitivo

Para contar de 1 a 5 com while, você precisa lembrar de três coisas: criar a variável, testar a condição e não esquecer o avanço — senão, laço infinito. É trabalho manual, e trabalho manual dá erro.

Quando o número de repetições é conhecido, existe uma ferramenta feita sob medida: o for. Ele cuida do avanço sozinho.

// a ideia centralUm garçom que serve item por item

Imagine o for como um garçom com uma bandeja de itens. Ele pega o primeiro, entrega para o seu bloco de código, espera você terminar, pega o próximo, e assim por diante — até a bandeja acabar. Você não controla o “próximo”: o garçom faz isso.

Por isso a frase que descreve o for é: “para cada item da coleção, faça isto”. Você só diz o que fazer com um item; o laço se encarrega de passar por todos.

A diferença essencial

No while, você avança a variável. No for, o laço avança sozinho para o próximo item. Menos código, e um tipo inteiro de bug (o laço infinito) simplesmente deixa de existir.

// a sintaxefor item in coleção

Percorrendo as letras de uma palavra, uma por vez:

letras.py
for letra in "Python":
    print(letra)
saída >P y t h o n (um por linha)

A cada volta, a variável letra recebe automaticamente o próximo caractere. Você escolhe o nome dessa variável — poderia ser for x in "Python":.

// a função rangeGerando uma sequência de números

E se você quer números, não letras? A função range cria a sequência para o for percorrer. Ela tem três formas:

range.py
range(5)          # 0, 1, 2, 3, 4   (começa no 0)
range(1, 6)       # 1, 2, 3, 4, 5   (de 1 até 6, sem o 6)
range(0, 10, 2)   # 0, 2, 4, 6, 8   (de 2 em 2)
🔑 A regra do range que mais confunde

O range não inclui o número final. range(1, 6) vai de 1 a 5. Pense assim: ele para antes de chegar no fim. Por isso, para contar de 1 a 10, você escreve range(1, 11).

Contar de 1 a 5 com for fica assim:

contador_for.py
for i in range(1, 6):
    print(i)
saída >1 2 3 4 5

// experimenteVeja o for puxar cada item

Escolha uma sequência e clique em “Próximo item”. O item da vez fica destacado e vai para a saída — é literalmente o que o for faz por dentro.

SAÍDA

// lado a ladoO mesmo contador, while vs for

Os dois imprimem 1 a 5. Repare como o for some com as três linhas de controle manual:

while
i = 1
while i <= 5:
    print(i)
    i += 1
for
for i in range(1,6):
    print(i)
Quando usar cada um

Use for quando souber a quantidade de repetições ou for percorrer uma coleção (uma contagem, os itens de uma lista, as letras de um texto). Use while quando a parada depende de uma condição imprevisível (“até o usuário acertar a senha”).

// erros comunsTrês tropeços frequentes

1. Achar que range(1, 10) inclui o 10

Inclui só até o 9. Para chegar ao 10, use range(1, 11). Esse “um a mais” no fim pega quase todo mundo no começo.

2. Esquecer que range começa no 0

range(5) produz 0, 1, 2, 3, 4 — cinco números, mas começando do zero. Se você quer de 1 a 5, precisa dizer range(1, 6).

3. Tentar mudar a variável do for para pular itens

Escrever i = i + 2 dentro de um for não pula itens: na próxima volta, o laço simplesmente entrega o próximo da sequência e ignora sua mudança. Para andar de 2 em 2, ajuste o range, não a variável.

// teste rápidoConsegue prever a saída?

Atenção ao começo em 0 e ao fim que não entra.

// pratiqueQuatro exercícios (com solução)

01 De 1 a 10

Imprima os números de 1 a 10 usando for e range.

Ver solução
sol_01.py
for i in range(1, 11):
    print(i)

Lembre do 11 no fim para incluir o 10.

02 Soma de 1 a 100

Some 1 até 100 com for e imprima o total. Compare com a versão de while da aula passada.

Ver solução
sol_02.py
soma = 0
for i in range(1, 101):
    soma += i
print(soma)   # 5050

Mesma lógica de acumulador, só que sem precisar criar e avançar o i na mão.

03 Tabuada

Peça um número e imprima a tabuada dele de 1 a 10 (ex.: 7 x 1 = 7, 7 x 2 = 14…).

Ver solução
sol_03.py
n = int(input("Número: "))

for i in range(1, 11):
    print(n, "x", i, "=", n * i)

04 Desafio: contar vogais

Dada uma palavra, conte quantas vogais ela tem. Percorra letra por letra com for e some quando a letra for uma vogal.

Ver solução
sol_04.py
palavra = "programacao"
vogais = 0

for letra in palavra:
    if letra in "aeiou":
        vogais += 1

print(vogais)   # 5

Repare como o for (percorrer as letras), o if (é vogal?) e o acumulador se juntam — você já domina as três peças.

// para levarResumo em cinco frases

  • for percorre uma coleção item por item: “para cada item, faça isto”.
  • O for avança sozinho — não existe laço infinito por esquecimento de avanço.
  • range(fim) começa no 0; range(início, fim) e range(início, fim, passo) dão mais controle.
  • range nunca inclui o número final — por isso 1 a 10 é range(1, 11).
  • Use for quando sabe a quantidade ou percorre uma coleção; while quando a parada é imprevisível.

No próximo passo

Guardar vários valores num lugar só: as listas.

↑ voltar ao índice
Python para iniciantes · aula 5

Guardar vários valores num lugar só: as listas

Uma variável comum guarda um valor. E quando você tem trinta nomes, ou os preços de um carrinho? A lista guarda muitos valores em ordem, sob um nome só — e combina perfeitamente com o for.

Aula de lógica de programação · leitura de ~8 min · continuação de “o laço for e o range”

// o problemaUma variável para cada coisa não escala

Imagine guardar o nome de três alunos:

sem_lista.py
aluno1 = "Ana"
aluno2 = "Bruno"
aluno3 = "Carla"

Com três, tudo bem. Com trinta, vira um pesadelo — e você não consegue percorrer todos com um laço, porque são variáveis separadas. Precisamos de uma “caixa” que segure vários valores juntos.

// a ideia centralUma estante de prateleiras numeradas

Pense numa lista como uma estante com prateleiras numeradas. Cada prateleira guarda um valor, e todas ficam sob um nome só. Para pegar um item, você diz o nome da estante e o número da prateleira.

Detalhe crucial que já apareceu no range: a numeração começa no 0. A primeira prateleira é a de número 0, a segunda é a 1, e assim por diante.

// a sintaxeCriar e acessar

Uma lista se escreve entre colchetes [ ], com os itens separados por vírgula:

frutas.py
frutas = ["maçã", "banana", "uva"]

print(frutas[0])    # maçã   (primeira prateleira)
print(frutas[2])    # uva    (terceira prateleira)
print(frutas[-1])   # uva    (atalho: a última)

O número entre colchetes é o índice. O índice -1 é um atalho muito usado: significa “a última prateleira”, sem você precisar saber o tamanho.

// operaçõesTamanho, trocar e adicionar

operacoes.py
frutas = ["maçã", "banana", "uva"]

len(frutas)              # 3  → quantos itens tem

frutas[1] = "laranja"     # troca a banana por laranja

frutas.append("kiwi")   # adiciona no fim da lista
🔑 len é a quantidade, não o último índice

Numa lista de 3 itens, len é 3, mas o último índice é 2 (porque começa no 0). Guarde: o último índice é sempre len - 1.

// experimenteMexa na lista e veja os índices

Adicione e remova itens. Repare como o len muda e como cada prateleira tem seu número, sempre começando no 0.

frutas = ["maçã", "banana", "uva"]
len(frutas) = 3 · último índice = 2

// o encontro perfeitoPercorrer a lista com for

Aqui os dois últimos assuntos se juntam. O for percorre uma lista item por item, sem você mexer em índice nenhum:

percorrer.py
frutas = ["maçã", "banana", "uva"]

for fruta in frutas:
    print(fruta)
saída >maçã / banana / uva

A cada volta, fruta recebe o próximo item da lista. É a forma mais natural de trabalhar com todos os valores de uma vez.

// erros comunsDuas ciladas com índices

1. Índice fora do alcance (IndexError)

Numa lista de 3 itens, os índices válidos são 0, 1 e 2. Pedir frutas[3] dá erro (IndexError), porque não existe uma quarta prateleira.

2. Achar que o primeiro item é o de índice 1

O primeiro item é frutas[0], não frutas[1]. Esse deslize é a fonte de metade dos bugs de quem começa — a contagem sempre parte do zero.

// teste rápidoConsegue prever a saída?

Lembre: a contagem começa no 0.

// pratiqueQuatro exercícios (com solução)

01 Primeiro e último

Dada a lista cores = ["azul", "verde", "vermelho"], imprima o primeiro e o último item.

Ver solução
sol_01.py
cores = ["azul", "verde", "vermelho"]

print(cores[0])    # azul
print(cores[-1])   # vermelho

02 Somar os números

Dada numeros = [10, 20, 30, 40], some todos e imprima o total, usando for.

Ver solução
sol_02.py
numeros = [10, 20, 30, 40]
soma = 0

for n in numeros:
    soma += n

print(soma)   # 100

O for percorre a lista e o acumulador soma cada valor — as três ideias que você já domina, juntas.

03 Contar os grandes

Dada notas = [4, 8, 6, 9, 3], conte quantas são maiores ou iguais a 7.

Ver solução
sol_03.py
notas = [4, 8, 6, 9, 3]
aprovados = 0

for nota in notas:
    if nota >= 7:
        aprovados += 1

print(aprovados)   # 2

04 Desafio: achar o maior

Dada valores = [3, 9, 2, 7, 5], encontre o maior número sem usar a função max.

Ver solução
sol_04.py
valores = [3, 9, 2, 7, 5]
maior = valores[0]   # começa supondo o 1º

for v in valores:
    if v > maior:
        maior = v

print(maior)   # 9

A tática é guardar um “campeão provisório” e trocá-lo sempre que aparecer alguém maior. No fim, sobra o maior de todos.

// para levarResumo em cinco frases

  • Uma lista guarda vários valores em ordem, sob um nome só, entre colchetes [ ].
  • Cada item tem um índice, e a contagem começa no 0: o primeiro é lista[0].
  • lista[-1] é um atalho para o último item; len(lista) diz quantos há.
  • O último índice é sempre len - 1; pedir além disso dá IndexError.
  • Percorrer com for item in lista é a forma natural de trabalhar com todos os valores.

No próximo passo

Guardar pares de informação (nome → valor): os dicionários.

↑ voltar ao índice
Python para iniciantes · aula 6

Buscar por nome, não por posição: os dicionários

Na lista, você acha as coisas pela posição (0, 1, 2…). Mas e quando faz mais sentido buscar por um nome — o preço do “café”, o telefone da “Ana”? Para isso existe o dicionário.

Aula de lógica de programação · leitura de ~8 min · continuação de “listas”

// o problemaNem tudo se acha por posição

Imagine guardar o preço de alguns produtos numa lista:

com_lista.py
precos = [5, 2, 4]   # café? pão? leite? qual é qual?

O número está lá, mas você teria que decorar que “o preço do café está na posição 0”. Se a ordem mudar, tudo quebra. O que você quer mesmo é perguntar direto: “quanto custa o café?” — buscar pelo nome, não pela posição.

// a ideia centralGavetas etiquetadas, não numeradas

Se a lista é uma estante de prateleiras numeradas, o dicionário é um armário de gavetas etiquetadas. Você não abre a “gaveta 0”: você abre a gaveta “café” e encontra o valor guardado nela.

Cada item do dicionário é um par: uma chave (a etiqueta) e um valor (o conteúdo). É a mesma ideia de um dicionário de verdade — você procura a palavra (chave) e lê o significado (valor).

Lista vs dicionário

Lista: acesso por posição (precos[0]). Dicionário: acesso por chave (precos["café"]). Escolha o dicionário quando cada valor tem um nome natural.

// a sintaxeCriar e acessar por chave

Um dicionário usa chaves { } e pares no formato chave: valor:

precos.py
precos = {"café": 5, "pão": 2, "leite": 4}

print(precos["café"])    # 5
print(precos["leite"])   # 4

Entre colchetes vai a chave, não um número. precos["café"] abre a gaveta “café” e devolve 5.

// operaçõesAdicionar, alterar e checar

operacoes.py
precos = {"café": 5, "pão": 2}

precos["suco"] = 6       # chave nova → adiciona
precos["café"] = 5.5     # chave existente → altera

len(precos)              # 3 → quantos pares
"café" in precos         # True → a chave existe?
🔑 A mesma linha faz duas coisas

precos["x"] = valor adiciona se a chave “x” ainda não existe, e altera se ela já existe. E, antes de acessar uma chave incerta, checar com in evita erro.

// experimenteAbra a gaveta pela etiqueta

Clique numa chave para buscar o valor. Repare no que acontece quando você procura uma chave que não existe — e depois adicione ela.

RESULTADOclique numa chave acima

// percorrerPassar por todos os pares com for

O for num dicionário entrega as chaves. Com .items(), ele entrega chave e valor de uma vez:

percorrer.py
precos = {"café": 5, "pão": 2, "leite": 4}

for produto, preco in precos.items():
    print(produto, "custa", preco)
saída >café custa 5 · pão custa 2 · leite custa 4

Também existem .keys() (só as chaves) e .values() (só os valores) — úteis, por exemplo, para somar todos os preços com .values().

// erros comunsDuas ciladas com chaves

1. Buscar uma chave que não existe (KeyError)

precos["chá"], se “chá” não estiver no dicionário, dá KeyError. Antes de acessar uma chave incerta, cheque com if "chá" in precos:.

2. Tentar usar índice numérico como na lista

precos[0] não pega “o primeiro” — ele procura uma chave chamada 0. Se ela não existir, dá KeyError. Dicionário se acessa pela chave, não pela posição.

// teste rápidoConsegue prever a saída?

Pense em chaves e valores — e no que acontece com uma chave que falta.

// pratiqueQuatro exercícios (com solução)

01 Consultar a agenda

Dado agenda = {"Ana": "9999-1111", "Bruno": "9888-2222"}, imprima o telefone da Ana.

Ver solução
sol_01.py
agenda = {"Ana": "9999-1111", "Bruno": "9888-2222"}

print(agenda["Ana"])   # 9999-1111

02 Somar os valores

Dado precos = {"café": 5, "pão": 2, "leite": 4}, some todos os preços e imprima o total.

Ver solução
sol_02.py
precos = {"café": 5, "pão": 2, "leite": 4}
total = 0

for preco in precos.values():
    total += preco

print(total)   # 11

.values() dá só os valores, e o acumulador soma cada um.

03 Estoque: existe ou não?

Dado estoque = {"maçã": 10, "uva": 4} e um produto, imprima a quantidade se ele existir, ou “não temos” caso contrário.

Ver solução
sol_03.py
estoque = {"maçã": 10, "uva": 4}
produto = "pera"

if produto in estoque:
    print(estoque[produto])
else:
    print("não temos")

Checar com in antes de acessar é o que evita o KeyError.

04 Desafio: o produto mais caro

Dado precos = {"café": 5, "pão": 2, "leite": 4, "bolo": 8}, descubra o nome do produto mais caro.

Ver solução
sol_04.py
precos = {"café": 5, "pão": 2, "leite": 4, "bolo": 8}
mais_caro = ""
maior_preco = 0

for produto, preco in precos.items():
    if preco > maior_preco:
        maior_preco = preco
        mais_caro = produto

print(mais_caro)   # bolo

Mesma tática do “campeão provisório” da aula de listas, agora guardando o nome junto com o maior valor, graças ao .items().

// para levarResumo em cinco frases

  • O dicionário guarda pares chave: valor entre chaves { } e busca por nome, não por posição.
  • Acesse com dic["chave"] — a etiqueta vai entre colchetes, não um número.
  • dic["x"] = valor adiciona se a chave é nova e altera se já existe.
  • Buscar uma chave inexistente dá KeyError; cheque antes com "x" in dic.
  • Percorra com for chave, valor in dic.items() para trabalhar com todos os pares.

No próximo passo

Organizar seu código em blocos reutilizáveis: as funções.

↑ voltar ao índice
Python para iniciantes · aula 7

Criando seus próprios comandos: as funções

Você já usou comandos prontos como print e len. Agora vai aprender a fabricar os seus: blocos de código com nome, escritos uma vez e reutilizados quantas vezes quiser.

Aula de lógica de programação · leitura de ~9 min · início do módulo “organizando o código”

// o problemaCopiar e colar espalha o mesmo código

Imagine que, em vários pontos do programa, você precise mostrar uma saudação em três linhas. Copiar e colar esse trecho funciona — até você querer mudar o texto e ter que caçar todas as cópias. Um erro em uma delas, e o comportamento fica inconsistente.

A solução é escrever esse bloco uma única vez, dar um nome a ele, e depois só chamá-lo pelo nome. Isso é uma função.

// a ideia centralUma máquina que você constrói

Pense numa função como uma máquina que você mesmo monta. Há dois momentos bem diferentes:

Construir a máquina (def): você descreve o que ela faz e dá um nome. Nesse momento, nada acontece ainda — a máquina fica ali, pronta, desligada.

Ligar a máquina (a chamada): você escreve o nome dela seguido de ( ). É só aí que o bloco roda. E você pode ligar quantas vezes quiser.

Definir ≠ executar

O defguarda a receita. O código dentro dela não roda enquanto você não chamar a função. Confundir esses dois momentos é o erro nº 1 de quem começa.

// a sintaxeDefinir e chamar

saudacao.py
def saudacao():        # constrói a máquina (não roda ainda)
    print("Olá!")
    print("Bem-vindo")

saudacao()             # liga a máquina → agora roda
saudacao()             # liga de novo
saída >Olá! / Bem-vindo / Olá! / Bem-vindo

Repare: as linhas de dentro do def ficam recuadas (indentadas), como no if e no for. E a chamada saudacao(), com os parênteses, é o que faz tudo acontecer.

// entradaParâmetros: dar informação para a máquina

Uma máquina fica mais útil quando aceita ingredientes. Em funções, esses ingredientes são os parâmetros — valores que você passa entre os parênteses:

saudacao_nome.py
def saudacao(nome):
    print("Olá,", nome)

saudacao("Ana")      # Olá, Ana
saudacao("Bruno")    # Olá, Bruno

Ao chamar, o valor que você passa ("Ana") entra na função como nome. A mesma máquina, resultados diferentes conforme a entrada.

// saídareturn: pegar o resultado de volta

Até aqui as funções só imprimiam. Mas muitas vezes você quer que a máquina devolva um resultado para você usar depois. Isso é o return:

dobro.py
def dobro(x):
    return x * 2

resultado = dobro(5)    # resultado recebe 10
print(resultado)         # 10
print(dobro(7) + 1)      # 15 (dá para usar direto numa conta)
🔑 print mostra, return devolve

printexibe algo na tela — o valor some depois. return entrega o valor de volta para quem chamou, para você guardar numa variável ou usar numa conta. Se uma função só dá print e você faz x = funcao(), o x fica None (vazio).

// experimenteRegule a entrada, veja a saída

Escolha a regra da função e mova a entrada. A máquina aplica a regra e devolve o resultado — é o que o return faz.

5entra dobromáquina 10retorna

// juntandoVários parâmetros

Uma função pode receber quantos ingredientes precisar, separados por vírgula:

soma.py
def soma(a, b):
    return a + b

print(soma(3, 4))     # 7
print(soma(10, 20))   # 30

A ordem importa: o primeiro valor vira a, o segundo vira b.

// erros comunsTrês tropeços com funções

1. Definir e nunca chamar

Só escrever o def não faz nada acontecer — é como montar a máquina e nunca ligar. Você precisa chamar a função para ela rodar.

2. Esquecer os parênteses ao chamar

Escrever saudacao (sem os ()) não liga a máquina — apenas se refere a ela. Para executar, é saudacao().

3. Usar print achando que é return

Se a função faz print em vez de return, você vê o valor na tela, mas não consegue guardá-lo. x = funcao() deixa x como None. Quando precisar do resultado depois, use return.

// teste rápidoConsegue prever a saída?

Preste atenção em quando a função é chamada e no que ela devolve.

// pratiqueQuatro exercícios (com solução)

01 Cumprimentar

Crie uma função cumprimentar(nome) que imprime "Bom dia, <nome>!". Chame-a com dois nomes diferentes.

Ver solução
sol_01.py
def cumprimentar(nome):
    print("Bom dia,", nome, "!")

cumprimentar("Ana")
cumprimentar("Bruno")

02 Área do retângulo

Crie area(base, altura) que retorna a área (base × altura). Imprima o resultado de uma chamada.

Ver solução
sol_02.py
def area(base, altura):
    return base * altura

print(area(4, 3))   # 12

Como usamos return, dá para guardar o resultado ou usá-lo numa conta maior.

03 É par?

Crie eh_par(n) que retorna True se n for par e False caso contrário. Dica: um número é par quando n % 2 == 0.

Ver solução
sol_03.py
def eh_par(n):
    return n % 2 == 0

print(eh_par(4))   # True
print(eh_par(7))   # False

A comparação n % 2 == 0 já vale True ou False — dá para retornar direto.

04 Desafio: o maior de dois

Crie maior(a, b) que retorna o maior dos dois números, sem usar a função max.

Ver solução
sol_04.py
def maior(a, b):
    if a > b:
        return a
    else:
        return b

print(maior(3, 8))   # 8

Repare que uma função pode ter vários return: o primeiro que o programa alcançar encerra a função e devolve aquele valor.

// para levarResumo em cinco frases

  • Uma função é um bloco de código com nome, escrito uma vez e reutilizado quantas vezes quiser.
  • def constrói a função, mas não a executa; a chamada nome() é que a roda.
  • Parâmetros são a entrada: valores que você passa entre os parênteses.
  • return é a saída: devolve um valor para quem chamou, para guardar ou reusar.
  • print só mostra na tela; se precisa do resultado depois, use return.

No próximo passo

Quando algo dá errado durante a execução: tratar erros com try / except.

↑ voltar ao índice
Python para iniciantes · aula 8

Quando algo dá errado: try e except

Alguns erros só aparecem durante a execução: um texto que não vira número, uma divisão por zero. Sem tratamento, eles derrubam o programa inteiro. O try/except é a rede que impede a queda.

Aula de lógica de programação · leitura de ~8 min · continuação de “funções”

// o problemaUm erro derruba tudo

Peça um número ao usuário e some 1. Parece inofensivo:

sem_tratamento.py
idade = int(input("Sua idade: "))
print("Ano que vem:", idade + 1)
se digitar "abc" >ValueError: invalid literal for int()

Se a pessoa digitar “abc” em vez de um número, o int() não consegue converter, o Python levanta um erro e o programa para na hora — despejando uma mensagem técnica assustadora. Precisamos de um plano B.

// a ideia centralA rede de segurança

Pense no try/except como a rede embaixo do trapezista. Você tenta a manobra arriscada (try); se cair, a rede te segura (except) em vez de você se espatifar no chão.

Em código: “tente rodar este bloco; se der qualquer erro no meio dele, abandone o resto e execute o plano B, sem travar o programa.”

O fluxo em uma frase

Se o try roda até o fim sem erro, o except é ignorado. Se der erro em alguma linha do try, o Python pula imediatamente para o except.

// a sintaxetry e except

com_tratamento.py
try:
    idade = int(input("Sua idade: "))
    print("Ano que vem:", idade + 1)
except:
    print("Isso não parece um número. Tente de novo.")
se digitar "abc" >Isso não parece um número. Tente de novo.

Agora, em vez de quebrar, o programa mostra uma mensagem amigável e segue vivo. Repare que o bloco try pode ter várias linhas — se qualquer uma falhar, o pulo para o except acontece na hora.

// experimenteVeja o programa "cair" na rede

Escolha o valor do divisor e clique em Executar. Com um número normal, o try vai até o fim. Com zero, a divisão dá erro e o programa cai no except.

x =
try:
    resultado = 10 / x
    print(resultado)
except ZeroDivisionError:
    print("Não dá para dividir por zero")
SAÍDAclique em Executar

// mais precisoCapturar o erro certo

Um except sozinho captura qualquer erro. Melhor do que isso é dizer qual erro você espera — assim você não esconde bugs de outro tipo por acidente. Cada situação tem seu nome de erro:

especifico.py
try:
    numero = int(texto)
    resultado = 10 / numero
except ValueError:
    print("O texto não era um número")
except ZeroDivisionError:
    print("Não posso dividir por zero")

Você pode ter vários except, cada um para um tipo de erro. Os nomes mais comuns no começo: ValueError (conversão inválida), ZeroDivisionError (divisão por zero), KeyError (chave que não existe num dicionário) e IndexError (posição fora da lista).

// erros comunsTrês armadilhas ao tratar erros

1. Um except que engole tudo em silêncio

Um except: vazio que não faz nada esconde qualquer problema, inclusive bugs de verdade que você gostaria de ver. Capture o erro específico e, no mínimo, avise o que aconteceu.

2. Colocar código demais dentro do try

Deixe no try só a linha que pode falhar. Se você embrulhar o programa inteiro, fica difícil saber o que exatamente deu errado.

3. Usar try/except quando um if bastava

Para checar algo que você consegue prever (a lista está vazia? a chave existe?), um if costuma ser mais claro. O try/except brilha nos casos que fogem do seu controle, como a digitação do usuário.

// teste rápidoConsegue prever a saída?

Acompanhe o fluxo: o erro faz o programa pular para o except.

// pratiqueQuatro exercícios (com solução)

01 Idade segura

Peça a idade com input e imprima o dobro. Se o usuário não digitar um número, mostre “Digite apenas números”.

Ver solução
sol_01.py
try:
    idade = int(input("Idade: "))
    print(idade * 2)
except ValueError:
    print("Digite apenas números")

02 Divisão segura

Crie uma função dividir(a, b) que retorna a / b, mas devolve a string "erro" se b for zero.

Ver solução
sol_02.py
def dividir(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return "erro"

print(dividir(10, 2))   # 5.0
print(dividir(10, 0))   # erro

Repare que o try/except funciona dentro de uma função como em qualquer outro lugar.

03 Buscar no dicionário

Dado precos = {"café": 5} e uma chave, imprima o preço ou “produto não encontrado” se a chave não existir — usando try/except.

Ver solução
sol_03.py
precos = {"café": 5}
chave = "chá"

try:
    print(precos[chave])
except KeyError:
    print("produto não encontrado")

04 Desafio: insistir até acertar

Fique pedindo um número ao usuário até ele digitar algo válido; então imprima o número. Junte while + try/except + break.

Ver solução
sol_04.py
while True:
    try:
        n = int(input("Digite um número: "))
        break                 # deu certo → sai do laço
    except ValueError:
        print("Inválido, tente de novo.")

print("Você digitou:", n)

Se a conversão falha, o except avisa e o while repete. Quando dá certo, o break encerra o laço. Aqui você juntou quase tudo que aprendeu.

// para levarResumo em cinco frases

  • Alguns erros só surgem na execução e, sem tratamento, derrubam o programa.
  • try tenta rodar um bloco; except é o plano B caso dê erro.
  • Sem erro, o except é ignorado; com erro, o resto do try é abandonado e o except roda.
  • Prefira capturar o erro específico (ValueError, ZeroDivisionError…) a um except genérico.
  • Use try/except para o que foge do seu controle (entrada do usuário); para o previsível, um if basta.

Você chegou ao fim da trilha de fundamentos

O próximo passo é o projeto final: juntar tudo num programa de verdade.

↑ voltar ao índice
Python para iniciantes · aula 9 · projeto final

Juntando tudo: o Jogo da Adivinhação

Chegou a hora de sair dos trechos soltos e escrever um programa completo. Um jogo simples, mas que usa quase tudo que você aprendeu nas oito aulas anteriores — do if ao try/except.

Projeto guiado · construído passo a passo · nível iniciante

// o objetivoO que vamos construir

O programa sorteia um número secreto de 1 a 100. Você tenta adivinhar; a cada palpite, ele responde “muito alto” ou “muito baixo”, até você acertar — e então conta em quantas tentativas você conseguiu.

Simples de descrever, mas repare em quantas ferramentas do curso ele exige:

  • Sortear e guardar o número — variáveis e o módulo random (fundamentos)
  • Repetir os palpites — laço while e break (aula 3)
  • Comparar o palpiteif / elif / else (aula 1)
  • Guardar os palpites e contarlistas e acumulador (aula 5)
  • Organizar em blocosfunções com return (aula 7)
  • Aguentar entrada inválidatry / except (aula 8)

// jogue agoraÉ isto que você vai construir

Antes de escrever uma linha, jogue a versão pronta aqui do lado. Tente também digitar algo que não é número — veja como ele não trava (isso é o try/except em ação).

🎯 Pensei num número de 1 a 100.
Consegue adivinhar? Digite um palpite e aperte Enter.
Estou esperando seu primeiro palpite…
tentativas: 0

// passo 1Sortear o número secreto

O Python tem um módulo chamado random para gerar números aleatórios. Nós o importamos e pedimos um número inteiro entre 1 e 100:

passo1.py
import random

secreto = random.randint(1, 100)   # sorteia de 1 a 100

importvariável import traz ferramentas prontas; randint(1, 100) devolve um número aleatório (aqui o 100 entra, diferente do range).

// passo 2Repetir os palpites com while

Não sabemos quantas tentativas o jogador vai levar — caso clássico de while. Repetimos “para sempre” e sairemos com break quando ele acertar:

passo2.py
while True:
    palpite = int(input("Seu palpite: "))
    # ... comparar aqui ...

whileinput

// passo 3Comparar com if / elif / else

Três caminhos: acertou, chutou baixo ou chutou alto. Quando acerta, o break encerra o laço:

passo3.py
    if palpite == secreto:
        print("Acertou!")
        break
    elif palpite < secreto:
        print("Muito baixo.")
    else:
        print("Muito alto.")

if / elif / elsebreak

// passo 4Não deixar um "abc" derrubar o jogo

Se o jogador digitar algo que não é número, o int() quebra. Envolvemos a leitura num try/except e usamos continue para recomeçar o laço sem contar aquela tentativa:

passo4.py
    try:
        palpite = int(input("Seu palpite: "))
    except ValueError:
        print("Digite um número!")
        continue   # volta ao topo do while

try / exceptcontinue

// passo 5Contar e guardar os palpites numa lista

Guardamos cada palpite numa lista e usamos len para saber quantas tentativas foram:

passo5.py
palpites = []
# ... dentro do laço, a cada palpite válido:
palpites.append(palpite)
# ... ao acertar:
print("Você acertou em", len(palpites), "tentativas!")

listaappendlen

// passo 6Organizar em funções

Por fim, separamos responsabilidades em funções: uma para sortear, outra para ler um palpite válido (com o tratamento de erro embutido). Fica mais limpo e reutilizável:

passo6.py
def pedir_palpite():
    while True:
        try:
            return int(input("Seu palpite: "))
        except ValueError:
            print("Digite um número!")

funçãoreturn Repare como o return dentro do try só acontece quando a conversão dá certo — senão, o laço pede de novo.

// o código completoTudo junto e funcionando

Reunindo os seis passos, este é o programa inteiro. Copie no seu computador e rode com Python:

jogo_adivinhacao.py
import random


def pedir_palpite():
    while True:
        try:
            return int(input("Seu palpite (1 a 100): "))
        except ValueError:
            print("Isso não é um número. Tente de novo.")


def jogar():
    secreto = random.randint(1, 100)
    palpites = []
    print("Pensei num número de 1 a 100. Adivinhe!")

    while True:
        palpite = pedir_palpite()
        palpites.append(palpite)

        if palpite == secreto:
            print("Acertou! Foram", len(palpites), "tentativas.")
            print("Seus palpites:", palpites)
            break
        elif palpite < secreto:
            print("Muito baixo. Tente um maior.")
        else:
            print("Muito alto. Tente um menor.")


jogar()
🎉 Olhe o que você acabou de ler

Neste único arquivo estão: import, funções com return, while, try/except, if/elif/else, break, uma lista com append e len. Você entende cada linha — e isso é ser capaz de programar.

// como evoluirTrês desafios para deixá-lo seu

Um projeto bom nunca está “terminado”. Tente estas melhorias — as soluções estão escondidas, mas tente antes de espiar.

01 Limite de tentativas

Dê ao jogador no máximo 7 chances. Se estourar, revele o número e encerre.

Ver ideia

Depois do append, cheque if len(palpites) >= 7: e, se ainda não acertou, imprima o número secreto e break.

02 Dica de "quente ou frio"

Além de alto/baixo, diga se o palpite está perto (diferença menor que 5) ou longe.

Ver ideia
dica.py
distancia = abs(palpite - secreto)
if distancia < 5:
    print("🔥 Quente!")
else:
    print("🧊 Frio.")

abs() devolve a distância sem sinal (sempre positiva).

03 Placar com dicionário

Guarde num dicionário o nome do jogador e em quantas tentativas ele venceu. No fim, mostre o ranking.

Ver ideia
placar.py
placar = {}
nome = input("Seu nome: ")
placar[nome] = len(palpites)   # tentativas até vencer

for jogador, tentativas in placar.items():
    print(jogador, "→", tentativas, "tentativas")

Aqui entram os dicionários (aula 6) e o .items() — fechando o uso de todo o curso.

// você conseguiuO que este projeto provou

  • Você sabe decompor um problema em passos e transformar cada um em código.
  • Você combina decisões, laços, listas, funções e tratamento de erros num programa só.
  • Você escreve código que aguenta o usuário — não trava com uma entrada estranha.
  • Você consegue ler e entender um programa completo, linha por linha.
  • E, o mais importante: você já consegue construir as suas próprias ideias.

Parabéns — você terminou a trilha! 🎓

De print("olá") a um programa completo. O próximo projeto é escolha sua.

↑ voltar ao índice