Resposta rápida
Esta é uma lista de 28 exercícios de Python para iniciantes, com resposta, saída real e explicação. Eles cobrem variáveis, input() e print(), condicionais, loops, listas, strings, dicionários e funções, em três níveis: básico, intermediário e desafio. Seis são no estilo de questão de prova.
1
2
3
4
5
# Exemplo: some os dígitos de 2026
soma = 0
for digito in "2026":
soma += int(digito)
print(soma) # 10
Resumo em 30 segundos:
- Nível 1 (exercícios 1 a 10): variáveis,
input(),if/elif/else,forewhile. - Nível 2 (exercícios 11 a 20): listas, strings, dicionários e funções.
- Nível 3 (exercícios 21 a 28): desafios que combinam tudo, como validar CPF e cifra de César.
- Todas as soluções foram executadas no Python 3.10 e a saída mostrada é a real.
- Tente por 15 a 20 minutos antes de abrir a resposta.
Salve salve Pythonista!
Ler tutorial ensina a reconhecer código; resolver exercício ensina a escrever código. É na hora de encarar a tela em branco que você descobre se entendeu mesmo o for, o if ou o dicionário.
Por isso montei esta lista com 28 exercícios novos, do básico ao desafio, pensados para quem está começando: estudantes de faculdade e EAD, quem está trocando de carreira ou quem quer revisar a base antes de uma prova. Cada exercício tem a solução escondida (clique em “Ver solução” só depois de tentar), a saída real do código e uma explicação curta do porquê.
Todos os códigos foram executados no Python 3.10. Nos exercícios com input(), a saída mostra o que aparece no terminal, incluindo os valores digitados.
Então… Bora pro post! ![]()
Vá Direto ao Assunto…
- Como usar esta lista de exercícios
- Exercícios de Python básicos (nível 1)
- Exercícios de Python intermediários (nível 2)
- Desafios de Python para iniciantes (nível 3)
- Erros comuns ao resolver exercícios
Como usar esta lista de exercícios
Exercício só funciona se você realmente tentar antes de ver a resposta. O método que eu recomendo:
- Leia o enunciado e escreva primeiro em português o que o programa precisa fazer, passo a passo. Isso separa “não sei a lógica” de “não sei a sintaxe”.
- Tente por 15 a 20 minutos. Travar faz parte: é nessa hora que o cérebro fixa o conteúdo.
- Rode o código de verdade, no seu computador ou no navegador. Não vale resolver “de cabeça”.
- Compare com a solução. Se a sua saída bate, está certo, mesmo que o código seja diferente.
- Refaça de memória dois ou três dias depois os exercícios em que você travou.
Se travar por falta de teoria (não sabe o que é um dicionário, por exemplo), volte ao tutorial indicado no começo de cada nível. Não tem problema pular um exercício e voltar depois.
Por onde começar:
| Se você… | Comece por | Revise antes |
|---|---|---|
| Nunca programou ou acabou de instalar o Python | Nível 1, exercício 1 | Variáveis, input() e print()
|
Já sabe if e for, mas trava em listas e dicionários |
Nível 2, exercício 11 | Listas, strings e dicionários |
| Já escreve funções e quer treinar lógica | Nível 3, exercício 21 | Funções e loops aninhados |
| Tem prova amanhã | Os 6 exercícios marcados como “questão de prova” | Os pontos do “Resumo em 30 segundos” |
E para localizar um assunto específico:
| Assunto | Exercícios |
|---|---|
| Variáveis e tipos | 1, 5, 10 |
input() e print()
|
2, 3, 4, 6, 7, 9, 10, 24 |
Condicionais (if, elif, else) |
3, 4, 14, 24 |
Loops (for e while) |
6, 7, 8, 20, 24, 26, 27 |
| Listas | 11, 17, 20, 26 |
| Strings | 9, 12, 13, 16, 18, 22, 23, 25, 27 |
| Dicionários | 14, 15, 28 |
| Funções | 14, 16, 17, 19, 21, 22, 23, 25, 26, 28 |
Se você está começando do absoluto zero, o roteiro de como aprender Python do zero mostra a ordem de estudo completa. E quando terminar esta lista, tem mais de 200 exercícios organizados por assunto na nossa página de exercícios resolvidos de Python.
Exercícios de Python básicos (nível 1)
Aqui entram variáveis, entrada e saída de dados, condicionais e os primeiros loops. Se algo parecer estranho, a teoria está nos posts sobre tipos de variáveis, input e print, operadores aritméticos e lógicos, estruturas condicionais e for e while.
Exercício 1. Com a = 5 e b = 9, troque os valores das duas variáveis sem usar uma terceira variável e imprima a = 9, b = 5.
Ver solução
1
2
3
4
5
6
a = 5
b = 9
a, b = b, a
print(f"a = {a}, b = {b}")
Saída: a = 9, b = 5
O Python monta a tupla (b, a) do lado direito primeiro e só depois distribui os valores, por isso a troca acontece em uma linha.
Exercício 2. Leia a distância percorrida por um carro (em km) e a quantidade de combustível gasta (em litros) e mostre o consumo médio em km/l com duas casas decimais.
Ver solução
1
2
3
4
5
distancia = float(input("Distância percorrida (km): "))
litros = float(input("Combustível gasto (litros): "))
consumo = distancia / litros
print(f"Consumo médio: {consumo:.2f} km/l")
Saída (digitando 432 e 36):
1
2
3
Distância percorrida (km): 432
Combustível gasto (litros): 36
Consumo médio: 12.00 km/l
O input() sempre devolve texto, então o float() é obrigatório antes da divisão; o :.2f da f-string fixa as duas casas.
Exercício 3. No Brasil, o voto é proibido para menores de 16 anos, facultativo para quem tem 16 ou 17 anos ou mais de 70, e obrigatório dos 18 aos 70. Leia o ano de nascimento e diga a situação da pessoa em 2026 (considere só o ano, sem mês e dia).
Ver solução
1
2
3
4
5
6
7
8
9
ano_nascimento = int(input("Ano de nascimento: "))
idade = 2026 - ano_nascimento
if idade < 16:
print(f"Com {idade} anos, ainda não pode votar.")
elif idade < 18 or idade > 70:
print(f"Com {idade} anos, o voto é facultativo.")
else:
print(f"Com {idade} anos, o voto é obrigatório.")
Saída (rodando quatro vezes, com 2012, 2009, 1990 e 1950):
1
2
3
4
5
6
7
8
Ano de nascimento: 2012
Com 14 anos, ainda não pode votar.
Ano de nascimento: 2009
Com 17 anos, o voto é facultativo.
Ano de nascimento: 1990
Com 36 anos, o voto é obrigatório.
Ano de nascimento: 1950
Com 76 anos, o voto é facultativo.
A ordem dos testes importa: o if elimina os menores de 16 primeiro, então o elif só precisa separar as duas faixas facultativas do resto.
Exercício 4. Uma loja dá 10% de desconto em compras acima de R$ 200 e 15% acima de R$ 500. Leia o valor da compra e mostre o percentual de desconto e o total a pagar.
Ver solução
1
2
3
4
5
6
7
8
9
10
11
total = float(input("Valor da compra: R$ "))
if total > 500:
desconto = 0.15
elif total > 200:
desconto = 0.10
else:
desconto = 0
valor_final = total * (1 - desconto)
print(f"Desconto de {desconto:.0%}. Total a pagar: R$ {valor_final:.2f}")
Saída (rodando três vezes, com 150, 350 e 620):
1
2
3
4
5
6
Valor da compra: R$ 150
Desconto de 0%. Total a pagar: R$ 150.00
Valor da compra: R$ 350
Desconto de 10%. Total a pagar: R$ 315.00
Valor da compra: R$ 620
Desconto de 15%. Total a pagar: R$ 527.00
A faixa maior (> 500) precisa ser testada primeiro: se o > 200 viesse antes, uma compra de R$ 620 pararia nele e ganharia só 10%.
Exercício 5 (questão de prova). Qual é a saída do código abaixo?
1
2
3
x = "5"
y = 2
print(x * y)
a) 10
b) 55
c) TypeError
d) 52
Ver solução
Saída: 55
Resposta: b. Como x é uma string (está entre aspas), * repete o texto duas vezes em vez de multiplicar; só x + y daria TypeError, porque o + não junta texto com número.
Exercício 6. Imprima, em uma única linha e separados por vírgula, todos os múltiplos de 3 entre 1 e 30.
Ver solução
1
2
multiplos = range(3, 31, 3)
print(*multiplos, sep=", ")
Saída: 3, 6, 9, 12, 15, 18, 21, 24, 27, 30
O range() com passo 3 já gera só os múltiplos, e o * entrega cada número como um argumento separado para o print(), que os junta com o sep.
Exercício 7. Peça a senha ao usuário até que ele digite python123. No final, mostre em quantas tentativas o acesso foi liberado.
Ver solução
1
2
3
4
5
6
7
8
tentativas = 0
senha = ""
while senha != "python123":
senha = input("Senha: ")
tentativas += 1
print(f"Acesso liberado após {tentativas} tentativa(s).")
Saída (digitando abc, Python123 e python123):
1
2
3
4
Senha: abc
Senha: Python123
Senha: python123
Acesso liberado após 3 tentativa(s).
O while é a escolha certa porque não sabemos quantas tentativas serão necessárias; repare que Python123 foi recusada, já que a comparação diferencia maiúsculas de minúsculas.
Exercício 8. Usando for, calcule o fatorial de 6 (6! = 6 x 5 x 4 x 3 x 2 x 1).
Ver solução
1
2
3
4
5
6
7
n = 6
fatorial = 1
for i in range(1, n + 1):
fatorial *= i
print(f"{n}! = {fatorial}")
Saída: 6! = 720
O acumulador começa em 1 (e não em 0, senão toda multiplicação daria zero) e o range vai até n + 1 porque o fim é exclusivo.
Exercício 9. Leia o nome completo de uma pessoa e mostre as iniciais em maiúsculas, com ponto, ignorando as partículas da, das, de, do, dos e e. Para maria das graças silva, o resultado é M.G.S..
Ver solução
1
2
3
4
5
6
7
8
9
nome = input("Nome completo: ")
ignorar = {"da", "das", "de", "do", "dos", "e"}
iniciais = ""
for parte in nome.split():
if parte.lower() not in ignorar:
iniciais += parte[0].upper() + "."
print(iniciais)
Saída (digitando maria das graças silva):
1
2
Nome completo: maria das graças silva
M.G.S.
O split() quebra o nome em palavras e parte[0] pega a primeira letra de cada uma; o conjunto ignorar deixa o teste not in curto e legível.
Exercício 10 (questão de prova). O usuário executa o código abaixo e digita 42. O que aparece na tela?
1
2
valor = input("Digite um número: ")
print(type(valor))
a) <class 'int'>
b) <class 'str'>
c) <class 'float'>
d) Depende do valor digitado
Ver solução
Saída (digitando 42):
1
2
Digite um número: 42
<class 'str'>
Resposta: b. O input() sempre devolve str, não importa o que foi digitado; para ter um número é preciso converter com int() ou float(), como diz a documentação oficial do input().
Se os exercícios básicos foram tranquilos, ótimo sinal: é hora de subir o nível. E se você quer continuar evoluindo com uma trilha completa, do básico ao Django, é isso que a Jornada Python oferece:
Exercícios de Python intermediários (nível 2)
Agora os dados ficam mais interessantes: listas, strings, dicionários e as primeiras funções. A teoria de cada assunto está nos posts sobre listas, manipulação de listas, fatiamento, strings, dicionários e funções.
Exercício 11. Rotacione a lista [1, 2, 3, 4, 5] duas posições para a direita, obtendo [4, 5, 1, 2, 3], usando fatiamento.
Ver solução
1
2
3
4
5
numeros = [1, 2, 3, 4, 5]
k = 2
rotacionada = numeros[-k:] + numeros[:-k]
print(rotacionada)
Saída: [4, 5, 1, 2, 3]
numeros[-2:] pega os dois últimos ([4, 5]), numeros[:-2] pega todo o resto ([1, 2, 3]), e o + junta as duas listas na nova ordem.
Exercício 12. Dada a frase "Python é uma linguagem simples e extremamente poderosa", mostre quantas palavras ela tem e qual é a palavra mais longa, sem usar max().
Ver solução
1
2
3
4
5
6
7
8
9
frase = "Python é uma linguagem simples e extremamente poderosa"
palavras = frase.split()
mais_longa = ""
for palavra in palavras:
if len(palavra) > len(mais_longa):
mais_longa = palavra
print(f"{len(palavras)} palavras. Mais longa: {mais_longa} ({len(mais_longa)} letras)")
Saída: 8 palavras. Mais longa: extremamente (12 letras)
A variável mais_longa guarda a “campeã” até o momento e só é trocada quando aparece uma palavra estritamente maior (com max(palavras, key=len) daria o mesmo resultado em uma linha).
Exercício 13. Mascare o CPF "123.456.789-10", trocando cada dígito por * exceto os dois últimos, e mantendo pontos e hífen: o resultado deve ser ***.***.***-10.
Ver solução
1
2
3
4
5
6
7
8
9
10
cpf = "123.456.789-10"
mascarado = ""
for i, caractere in enumerate(cpf):
if caractere.isdigit() and i < len(cpf) - 2:
mascarado += "*"
else:
mascarado += caractere
print(mascarado)
Saída: ***.***.***-10
Strings são imutáveis, então montamos uma nova caractere a caractere; o enumerate() entrega a posição para saber quando chegamos aos dois últimos.
Exercício 14. Com o estoque {"caderno": 10, "caneta": 3, "mochila": 0}, escreva a função vender(estoque, produto, quantidade) que desconta a venda se houver quantidade suficiente e, caso contrário, devolve uma mensagem de estoque insuficiente (inclusive para produtos que não existem).
Ver solução
1
2
3
4
5
6
7
8
9
10
11
12
13
14
estoque = {"caderno": 10, "caneta": 3, "mochila": 0}
def vender(estoque, produto, quantidade):
disponivel = estoque.get(produto, 0)
if quantidade > disponivel:
return f"Estoque insuficiente de {produto}: só há {disponivel}."
estoque[produto] = disponivel - quantidade
return f"Venda ok. Restam {estoque[produto]} de {produto}."
print(vender(estoque, "caneta", 2))
print(vender(estoque, "caneta", 2))
print(vender(estoque, "régua", 1))
Saída:
1
2
3
Venda ok. Restam 1 de caneta.
Estoque insuficiente de caneta: só há 1.
Estoque insuficiente de régua: só há 0.
O get(produto, 0) evita o KeyError para a régua, que não está no dicionário, e a função altera o próprio dicionário recebido, por isso a segunda venda já enxerga só 1 caneta.
Exercício 15. Dado cidades = {"ana": "SP", "bia": "RJ", "caio": "SP", "duda": "MG", "enzo": "RJ"}, monte um novo dicionário agrupando as pessoas por estado: {"SP": [...], "RJ": [...], "MG": [...]}.
Ver solução
1
2
3
4
5
6
7
8
9
cidades = {"ana": "SP", "bia": "RJ", "caio": "SP", "duda": "MG", "enzo": "RJ"}
por_estado = {}
for pessoa, estado in cidades.items():
if estado not in por_estado:
por_estado[estado] = []
por_estado[estado].append(pessoa)
print(por_estado)
Saída: {'SP': ['ana', 'caio'], 'RJ': ['bia', 'enzo'], 'MG': ['duda']}
Na primeira vez que um estado aparece, criamos a lista vazia; nas seguintes, só acrescentamos o nome, e os estados ficam na ordem em que foram vistos pela primeira vez.
Exercício 16. Escreva a função formatar_telefone(numero) que recebe só dígitos e devolve o telefone formatado: 11 dígitos (celular) viram (61) 98765-4321 e 10 dígitos (fixo) viram (11) 3333-4444.
Ver solução
1
2
3
4
5
6
7
8
9
def formatar_telefone(numero):
ddd = numero[:2]
if len(numero) == 11:
return f"({ddd}) {numero[2:7]}-{numero[7:]}"
return f"({ddd}) {numero[2:6]}-{numero[6:]}"
print(formatar_telefone("61987654321"))
print(formatar_telefone("1133334444"))
Saída:
1
2
(61) 98765-4321
(11) 3333-4444
Os dois primeiros dígitos são o DDD e o fatiamento divide o resto em duas partes; o segundo return só executa quando o if é falso, então não precisa de else.
Exercício 17. Escreva a função separar_pares_impares(numeros) que devolve duas listas, uma com os pares e outra com os ímpares, e teste com [4, 7, 10, 13, 16, 21].
Ver solução
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def separar_pares_impares(numeros):
pares = []
impares = []
for n in numeros:
if n % 2 == 0:
pares.append(n)
else:
impares.append(n)
return pares, impares
pares, impares = separar_pares_impares([4, 7, 10, 13, 16, 21])
print("Pares:", pares)
print("Ímpares:", impares)
Saída:
1
2
Pares: [4, 10, 16]
Ímpares: [7, 13, 21]
return pares, impares devolve uma tupla com as duas listas, que é desempacotada direto em duas variáveis na chamada.
Exercício 18 (questão de prova). Qual é a saída do código abaixo?
1
2
frutas = "banana,maçã,,uva".split(",")
print(len(frutas))
a) 3
b) 4
c) 5
d) Gera um erro
Ver solução
Saída: 4
Resposta: b. Entre as duas vírgulas seguidas existe uma string vazia, e o split(",") a mantém: a lista é ['banana', 'maçã', '', 'uva'], com 4 itens.
Exercício 19 (questão de prova). Qual é a saída do código abaixo?
1
2
3
4
5
6
7
8
def primeiro_par(numeros):
for n in numeros:
if n % 2 == 0:
return n
return -1
print(primeiro_par([3, 7, 8, 10]), primeiro_par([1, 5]))
a) 8 -1
b) 10 -1
c) 8 None
d) [8, 10] -1
Ver solução
Saída: 8 -1
Resposta: a. O return encerra a função na hora, então o 10 nunca é examinado; na lista sem pares o for termina e a execução chega ao return -1.
Exercício 20. As temperaturas da semana (de segunda a domingo) foram [22, 25, 19, 24, 30, 28, 21]. Descubra a maior variação entre dois dias seguidos e entre quais dias ela aconteceu.
Ver solução
1
2
3
4
5
6
7
8
9
10
11
12
dias = ["seg", "ter", "qua", "qui", "sex", "sáb", "dom"]
temperaturas = [22, 25, 19, 24, 30, 28, 21]
maior = 0
posicao = 0
for i in range(1, len(temperaturas)):
variacao = abs(temperaturas[i] - temperaturas[i - 1])
if variacao > maior:
maior = variacao
posicao = i
print(f"Maior variação: {maior} graus ({dias[posicao - 1]} -> {dias[posicao]})")
Saída: Maior variação: 7 graus (sáb -> dom)
O range começa em 1 para que temperaturas[i - 1] sempre exista, e o abs() conta quedas e subidas da mesma forma (de 28 para 21 são 7 graus).
Está curtindo esse conteúdo? ![]()
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
Desafios de Python para iniciantes (nível 3)
Os desafios combinam tudo o que apareceu até aqui e exigem mais lógica do que sintaxe. Se travar, vale revisar funções, loops com while, loops com for e list comprehensions.
Exercício 21. Escreva a função cpf_valido(cpf) que confere os dois dígitos verificadores de um CPF. Regra: multiplique os 9 primeiros dígitos pelos pesos 10, 9, …, 2 e some; o primeiro verificador é (soma x 10) % 11, trocando 10 por 0. Para o segundo, use os 10 primeiros dígitos com pesos de 11 a 2. CPFs com todos os dígitos iguais são inválidos.
Ver solução
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def cpf_valido(cpf):
digitos = [int(c) for c in cpf if c.isdigit()]
if len(digitos) != 11 or len(set(digitos)) == 1:
return False
for posicao in (9, 10):
soma = 0
for i in range(posicao):
soma += digitos[i] * (posicao + 1 - i)
verificador = (soma * 10) % 11 % 10
if verificador != digitos[posicao]:
return False
return True
print(cpf_valido("529.982.247-25"))
print(cpf_valido("529.982.247-26"))
print(cpf_valido("111.111.111-11"))
Saída:
1
2
3
True
False
False
O mesmo laço calcula os dois verificadores (posições 9 e 10), e o % 10 final transforma o resto 10 em 0 sem precisar de if; o set() detecta os CPFs com dígitos todos iguais, que passariam no cálculo.
Exercício 22. Implemente a cifra de César: a função cifrar(texto, deslocamento) troca cada letra pela que está deslocamento posições à frente no alfabeto (voltando ao início depois do z) e mantém espaços e outros caracteres. Cifre "python zen" com deslocamento 3 e depois decifre.
Ver solução
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def cifrar(texto, deslocamento):
alfabeto = "abcdefghijklmnopqrstuvwxyz"
resultado = ""
for letra in texto.lower():
if letra in alfabeto:
nova_posicao = (alfabeto.index(letra) + deslocamento) % 26
resultado += alfabeto[nova_posicao]
else:
resultado += letra
return resultado
secreta = cifrar("python zen", 3)
print(secreta)
print(cifrar(secreta, -3))
Saída:
1
2
sbwkrq chq
python zen
O % 26 faz o alfabeto “dar a volta” (o z com deslocamento 3 vira c), e decifrar é só cifrar com o deslocamento negativo.
Exercício 23. Escreva a função sao_anagramas(a, b) que diz se duas palavras ou frases usam exatamente as mesmas letras, ignorando espaços e maiúsculas. Teste com "Roma" e "amor", "Iracema" e "America", "python" e "java".
Ver solução
1
2
3
4
5
6
7
8
9
def sao_anagramas(a, b):
a = a.replace(" ", "").lower()
b = b.replace(" ", "").lower()
return sorted(a) == sorted(b)
print(sao_anagramas("Roma", "amor"))
print(sao_anagramas("Iracema", "America"))
print(sao_anagramas("python", "java"))
Saída:
1
2
3
True
True
False
Duas palavras são anagramas quando, com as letras em ordem alfabética, ficam idênticas; o sorted() numa string devolve a lista de letras já ordenada.
Exercício 24. Faça um jogo de adivinhação: o número secreto é 37 e o programa pede palpites de 1 a 100, respondendo Mais alto! ou Mais baixo! até o usuário acertar. No fim, mostre o número de tentativas.
Ver solução
1
2
3
4
5
6
7
8
9
10
11
12
13
segredo = 37
tentativas = 0
while True:
palpite = int(input("Seu palpite (1 a 100): "))
tentativas += 1
if palpite < segredo:
print("Mais alto!")
elif palpite > segredo:
print("Mais baixo!")
else:
print(f"Acertou em {tentativas} tentativas!")
break
Saída (digitando 50, 25, 40 e 37):
1
2
3
4
5
6
7
8
Seu palpite (1 a 100): 50
Mais baixo!
Seu palpite (1 a 100): 25
Mais alto!
Seu palpite (1 a 100): 40
Mais baixo!
Seu palpite (1 a 100): 37
Acertou em 4 tentativas!
O while True com break é o padrão para “repita até acontecer algo”; para sortear o número de verdade, troque o 37 por random.randint(1, 100) (deixamos fixo para a saída ser reproduzível).
Exercício 25. Escreva a função comprimir(texto) que troca cada sequência de letras repetidas pela letra seguida da quantidade: "aaabccdddd" vira "a3b1c2d4".
Ver solução
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def comprimir(texto):
if not texto:
return ""
resultado = ""
atual = texto[0]
contagem = 1
for letra in texto[1:]:
if letra == atual:
contagem += 1
else:
resultado += f"{atual}{contagem}"
atual = letra
contagem = 1
resultado += f"{atual}{contagem}"
return resultado
print(comprimir("aaabccdddd"))
print(comprimir("python"))
Saída:
1
2
a3b1c2d4
p1y1t1h1o1n1
A última sequência nunca encontra uma letra diferente depois dela, por isso a linha resultado += ... depois do for é obrigatória; sem ela, o d4 sumiria.
Exercício 26. Escreva a função mesclar(a, b) que junta duas listas já ordenadas em uma única lista ordenada, sem usar sort() nem sorted(). Teste com [1, 4, 9, 12] e [2, 3, 10].
Ver solução
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def mesclar(a, b):
i = j = 0
resultado = []
while i < len(a) and j < len(b):
if a[i] <= b[j]:
resultado.append(a[i])
i += 1
else:
resultado.append(b[j])
j += 1
resultado.extend(a[i:])
resultado.extend(b[j:])
return resultado
print(mesclar([1, 4, 9, 12], [2, 3, 10]))
Saída: [1, 2, 3, 4, 9, 10, 12]
Dois índices andam pelas listas e, a cada passo, o menor dos dois elementos entra no resultado; quando uma lista acaba, o que sobrou da outra já está em ordem e entra de uma vez com extend().
Exercício 27 (questão de prova). Qual é a saída do código abaixo?
1
2
3
4
5
6
7
8
9
10
11
texto = "abacaxi"
resultado = ""
for i, letra in enumerate(texto):
if letra == "a":
continue
if i > 5:
break
resultado += letra.upper()
print(resultado)
a) BCX
b) BCXI
c) bcx
d) ABACAX
Ver solução
Saída: BCX
Resposta: a. Todo a é pulado pelo continue; b (índice 1), c (3) e x (5) entram em maiúsculas, e o i (índice 6) dispara o break antes de ser adicionado.
Exercício 28 (questão de prova). Qual é a saída do código abaixo?
1
2
3
4
5
6
7
8
9
def contar(texto):
contagem = {}
for palavra in texto.lower().split():
contagem[palavra] = contagem.get(palavra, 0) + 1
return contagem
r = contar("Python é bom e python é fácil")
print(r["python"], len(r))
a) 1 7
b) 2 5
c) 2 7
d) KeyError
Ver solução
Saída: 2 5
Resposta: b. O lower() faz Python e python virarem a mesma chave (contada 2 vezes), e o dicionário fica com 5 chaves distintas: python, é, bom, e e fácil.
Erros comuns ao resolver exercícios
Estes são os erros que mais aparecem em quem está começando, com a última linha real que o Python 3.10 mostra.
Somar texto com número (TypeError)
1
2
idade = input("Idade: ")
print(idade + 1)
1
TypeError: can only concatenate str (not "int") to str
Correção: converta a entrada antes de fazer conta: idade = int(input("Idade: ")).
Converter decimal com int() (ValueError)
1
nota = int(input("Nota: ")) # o usuário digita 3.5
1
ValueError: invalid literal for int() with base 10: '3.5'
Correção: para valores com casas decimais, use float(input(...)). O int() só aceita texto que represente um número inteiro.
Esquecer a indentação depois do if (IndentationError)
1
2
3
nota = 8
if nota >= 7:
print("Aprovado")
1
IndentationError: expected an indented block after 'if' statement on line 2
Correção: tudo que pertence ao if, for, while ou def fica recuado com 4 espaços, como recomenda o guia de estilo PEP 8.
Errar maiúscula e minúscula no nome da variável (NameError)
1
2
nome = "Ana"
print(Nome)
1
NameError: name 'Nome' is not defined. Did you mean: 'nome'?
Correção: o Python diferencia maiúsculas de minúsculas, então nome e Nome são variáveis diferentes. A sugestão Did you mean aparece a partir do Python 3.10.
Acessar uma chave que não existe no dicionário (KeyError)
1
2
estoque = {"caneta": 3}
print(estoque["lápis"])
1
KeyError: 'lápis'
Correção: teste antes com if "lápis" in estoque: ou use estoque.get("lápis", 0), que devolve um valor padrão em vez de quebrar (como no exercício 14).
Quer praticar com projetos guiados, do básico ao avançado, e tirar dúvidas com quem já trilhou o caminho? Conheça o nosso curso de Python completo, a Jornada Python.
Conclusão
Nesta lista de exercícios de Python para iniciantes, você praticou:
✅ Nível 1 - Variáveis, input(), print(), if/elif/else, for e while
✅ Nível 2 - Listas, strings, dicionários e funções
✅ Nível 3 - Desafios de lógica: CPF, cifra de César, anagramas, compressão e mesclagem
✅ Questões de prova - 6 exercícios com alternativas e resposta explicada
✅ Erros comuns - TypeError, ValueError, IndentationError, NameError e KeyError
Principais lições:
- O
input()sempre devolvestr: converta antes de fazer conta. - Em cadeias de
if/elif, a ordem dos testes muda o resultado. - O fim do
range()é exclusivo e acumuladores de multiplicação começam em 1. - O
returnencerra a função na hora, mesmo dentro de um loop. -
dict.get(chave, padrao)evita oKeyError.
Próximos passos:
- Refaça sem olhar os exercícios em que você travou
- Continue com os mais de 200 exercícios resolvidos de Python, organizados por assunto
- Aprenda a deixar seus loops mais curtos com list comprehensions
Se ficou com alguma dúvida em algum exercício, deixe um comentário no box aqui embaixo! Será um prazer te responder! ![]()
Perguntas frequentes
Qual a melhor forma de estudar Python com exercícios?
Leia o enunciado, tente resolver sozinho por 15 a 20 minutos, rode o código de verdade e só então compare com a resposta. Depois, refaça o mesmo exercício de memória dois ou três dias depois. Digitar e executar o código ensina muito mais do que só ler a solução, porque é rodando que você encontra os erros que caem na prova e no trabalho.
Quantos exercícios de Python devo fazer por dia?
Constância vale mais que volume: 3 a 5 exercícios por dia, todos os dias, rendem mais do que 30 num único fim de semana. Se o exercício levar mais de 40 minutos, divida em partes menores. O importante é entender cada solução a ponto de conseguir explicá-la em voz alta, não bater uma meta de quantidade.
Devo olhar a resposta quando travar em um exercício?
Pode, desde que você tenha tentado de verdade antes (uns 15 a 20 minutos) e siga uma regra: depois de ler a resposta, feche e escreva a solução de novo sem olhar. Se travou por falta de teoria, volte ao tutorial do assunto antes de continuar. Olhar a resposta cedo demais dá a falsa sensação de que você aprendeu.
Em que ordem estudar os assuntos de Python para iniciantes?
A ordem que mais funciona é: variáveis e tipos, input e print, operadores, condicionais (if, elif, else), loops (for e while), strings, listas, dicionários e, por fim, funções. Cada assunto usa os anteriores. Os exercícios desta lista seguem essa sequência e estão divididos em três níveis: básico, intermediário e desafio.
Como saber se minha solução está certa se ela é diferente da resposta?
Quase todo exercício tem várias soluções corretas. Rode o seu código com os mesmos valores do enunciado e compare a saída com a saída mostrada na resposta. Depois teste casos-limite: lista vazia, zero, número negativo, texto com letras maiúsculas. Se a saída bate em todos os casos, sua solução está certa, mesmo que o código seja diferente.
Como me preparar para questões de prova de Python?
Treine ler código sem executar: para cada questão, anote no papel o valor de cada variável linha a linha e só depois rode para conferir. As pegadinhas mais comuns em prova são o input() que devolve texto, o fim exclusivo do range(), a indentação que coloca o print dentro ou fora do loop e funções que usam print no lugar de return.
"Porque o Senhor dá a sabedoria, e da sua boca vem a inteligência e o entendimento" Pv 2:6