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ª verdadeiraelif segunda_condição: # opcional — pode ter quantos quiser# só é testada se a de cima falhouelif 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árioselif.
3. O elsenã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:
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
>= 6
resultado
70
testa → ✓
—
—
Meia (idoso)
25
testa → ✗
testa → ✓
—
Inteira
4
testa → ✗
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 = 70if 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:
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 = 14if 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 = -4if 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 = 95if 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 = 78if 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 = 60if 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 = 950if 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 = 950if 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 elsenã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).
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 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 = Falseifnot 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:
A
B
A and B
A or B
V
V
V
V
V
F
F
V
F
V
F
V
F
F
F
F
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 = 6if nota >= 5and 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 maise possuir carteira. Dadas idade e tem_carteira (True/False), imprima “pode dirigir” ou “não pode”.
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.
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ávelwhile i <= 5: # 2. condição: repita enquanto isto for verdadeprint(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 = 1voltas: 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
volta
i antes
i <= 5 ?
imprime
i depois
1
1
V
1
2
2
2
V
2
3
3
3
V
3
4
4
4
V
4
5
5
5
V
5
6
—
6
F
—
fim
// 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 = 1while 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:
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
whileTrue: # repete indefinidamente
opcao = input("Continuar? (s/n) ")
if opcao == "n":
break# sai do laço imediatamenteprint("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 = 1while 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 = 1while i <= 100:
soma = soma + i
i += 1print(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 = 10while 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.
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 rangenã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 inrange(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 = 1while i <= 5:
print(i)
i += 1
for
for i inrange(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 inrange(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 = 0for i inrange(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 inrange(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 = 0for letra in palavra:
if letra in"aeiou":
vogais += 1print(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.
rangenunca 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.
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:
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.
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["x"] = valoradiciona 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.
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 def só guarda 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
defsaudacao(): # constrói a máquina (não roda ainda)print("Olá!")
print("Bem-vindo")
saudacao() # liga a máquina → agora rodasaudacao() # 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
defsaudacao(nome):
print("Olá,", nome)
saudacao("Ana") # Olá, Anasaudacao("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
defdobro(x):
return x * 2
resultado = dobro(5) # resultado recebe 10print(resultado) # 10print(dobro(7) + 1) # 15 (dá para usar direto numa conta)
🔑 print mostra, return devolve
print só exibe algo na tela — o valor some depois. returnentrega 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
defsoma(a, b):
return a + b
print(soma(3, 4)) # 7print(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.
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:
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áriosexcept, 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”.
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
whileTrue:
try:
n = int(input("Digite um número: "))
break# deu certo → sai do laçoexcept 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.
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 palpite — if / elif / else(aula 1)
Guardar os palpites e contar — listas e acumulador (aula 5)
Organizar em blocos — funções com return(aula 7)
Aguentar entrada inválida — try / 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ávelimport 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:
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:
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
defpedir_palpite():
whileTrue:
try:
returnint(input("Seu palpite (1 a 100): "))
except ValueError:
print("Isso não é um número. Tente de novo.")
defjogar():
secreto = random.randint(1, 100)
palpites = []
print("Pensei num número de 1 a 100. Adivinhe!")
whileTrue:
palpite = pedir_palpite()
palpites.append(palpite)
if palpite == secreto:
print("Acertou! Foram", len(palpites), "tentativas.")
print("Seus palpites:", palpites)
breakelif 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é vencerfor 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.