Exercícios de Python para Iniciantes: 28 Exercícios com Respostas

Cansado de programar?

Conheça a melhor e mais completa formação de Python e Django e sinta-se um programador verdadeiramente competente. Além de Python e Django, você também vai aprender Banco de Dados, SQL, HTML, CSS, Javascript, Bootstrap e muito mais!

Quero aprender Python e Django de Verdade! Quero aprender!
Suporte

Tire suas dúvidas diretamente com o professor

Projetos práticos

Projetos práticos voltados para o mercado de trabalho

Prática profissional

Formação moderna com foco na prática profissional

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, for e while.
  • 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! :rocket:

Vá Direto ao Assunto…

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:

  1. 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”.
  2. Tente por 15 a 20 minutos. Travar faz parte: é nessa hora que o cérebro fixa o conteúdo.
  3. Rode o código de verdade, no seu computador ou no navegador. Não vale resolver “de cabeça”.
  4. Compare com a solução. Se a sua saída bate, está certo, mesmo que o código seja diferente.
  5. 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? :thumbsup:

Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?

Sua assinatura não pôde ser validada.
Você fez sua assinatura com sucesso.

Assine as PyDicas e receba 30 dias do melhor conteúdo Python na sua Caixa de Entrada: direto e sem enrolação!

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 devolve str: 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 return encerra a função na hora, mesmo dentro de um loop.
  • dict.get(chave, padrao) evita o KeyError.

Próximos passos:

Se ficou com alguma dúvida em algum exercício, deixe um comentário no box aqui embaixo! Será um prazer te responder! :wink:

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.

Começe agora sua Jornada na Programação!

Não deixe para amanhã o sucesso que você pode começar a construir hoje!

#newsletter Olá :wave: Curtiu o artigo? Então faça parte da nossa Newsletter! Privacidade Não se preocupe, respeitamos sua privacidade. Você pode se descadastrar a qualquer momento.