Desafios Práticos em Python
Esta coleção apresenta 19 exercícios focados em tarefas comuns de programação, desde automação de scripts até manipulação de dados, para desenvolver competências em Python.
Exercício 1: Geração de Contas de Usuário
Implemente uma função que crie contas de registro em lote, com endereços de e-mail terminados em @163.com. O comprimento do nome de usuário e a quantidade devem ser fornecidos pelo usuário. Os nomes devem ser únicos, compsotos por letras maiúsculas, minúsculas e dígitos.
import random
import string
def gerar_contas(quantidade, tamanho):
dominio = "@163.com"
contas = set()
caracteres = string.ascii_letters + string.digits
while len(contas) < quantidade:
nome_usuario = ''.join(random.choice(caracteres) for _ in range(tamanho))
if nome_usuario not in contas:
contas.add(nome_usuario + dominio)
return list(contas)
# Exemplo de uso:
quantidade = int(input("Insira a quantidade de contas: "))
tamanho = int(input("Insira o comprimento do nome de usuário: "))
resultado = gerar_contas(quantidade, tamanho)
for conta in resultado:
print(conta)
Exercício 2: Script de Limpeza de Logs
Escreva um script para remover arquivos de log com mais de três dias, considerando o formato de nome como "xxx-20170623.log".
import os
import datetime
def limpar_logs(diretorio, dias=3):
data_limite = datetime.datetime.now() - datetime.timedelta(days=dias)
for arquivo in os.listdir(diretorio):
if arquivo.endswith(".log"):
partes = arquivo.split('-')
if len(partes) >= 2:
data_str = partes[1].replace('.log', '')
try:
data_arquivo = datetime.datetime.strptime(data_str, "%Y%m%d")
if data_arquivo < data_limite:
caminho = os.path.join(diretorio, arquivo)
os.remove(caminho)
print(f"Removido: {arquivo}")
except ValueError:
continue
Exercício 3: Monitoramento de Logs do Nginx
Crie um script que analise logs do Nginx a cada minuto, bloqueando IPs com mais de 200 solicittações nesse período. O formato do log é similar ao exemplo fornecido.
import re
from collections import defaultdict
def monitorar_logs(arquivo_log, limite=200):
contagem_ip = defaultdict(int)
padrao_ip = r'^([\d.]+)\s'
with open(arquivo_log, 'r') as f:
for linha in f:
correspondencia = re.match(padrao_ip, linha)
if correspondencia:
ip = correspondencia.group(1)
contagem_ip[ip] += 1
for ip, contagem in contagem_ip.items():
if contagem > limite:
print(f"IP bloqueado: {ip} com {contagem} requisições")
Exercício 4: Soma de Números de 1 a 100
Calcule a soma acumulada dos números de 1 a 100.
soma = sum(range(1, 101))
print(f"A soma de 1 a 100 é: {soma}")
Exercício 5: Contagem de Linhas de Código
Desenvolva um script que estatize o total de linhas, linhas em branco e linhas de comentários em arquivos Python dentro de um diretório.
import os
def contar_linhas(diretorio):
total_linhas = 0
linhas_vazias = 0
linhas_comentarios = 0
for raiz, _, arquivos in os.walk(diretorio):
for arquivo in arquivos:
if arquivo.endswith(".py"):
caminho = os.path.join(raiz, arquivo)
with open(caminho, 'r', encoding='utf-8') as f:
for linha in f:
total_linhas += 1
linha_strip = linha.strip()
if not linha_strip:
linhas_vazias += 1
elif linha_strip.startswith('#'):
linhas_comentarios += 1
return total_linhas, linhas_vazias, linhas_comentarios
Exercício 6: Filtro de Palavras Sensíveis
Implemente um script que substitua palavras sensíveis por '**' em uma entrada de texto. A lista de palavras é fornecida.
def filtrar_texto(texto, palavras_sensiveis):
for palavra in palavras_sensiveis:
texto = texto.replace(palavra, '**')
return texto
# Exemplo:
palavras = ["exemplo1", "exemplo2"] # Lista adaptada
entrada = "Texto com palavras exemplo1 e exemplo2."
saida = filtrar_texto(entrada, palavras)
print(saida)
Exercício 7: Web Scraping para Imagens
Crie um crawler simples para baixar todas as imagens de uma página web específica e salvá-las localmente.
import requests
from bs4 import BeautifulSoup
import os
def baixar_imagens(url, diretorio="imagens"):
if not os.path.exists(diretorio):
os.makedirs(diretorio)
resposta = requests.get(url)
sopa = BeautifulSoup(resposta.text, 'html.parser')
imagens = sopa.find_all('img')
for i, img in enumerate(imagens):
src = img.get('src')
if src:
caminho = os.path.join(diretorio, f"imagem_{i}.jpg")
with open(caminho, 'wb') as f:
f.write(requests.get(src).content)
Exercício 8: Conversão de JSON para Excel
Escreva código para ler um arquivo JSON com notas de alunos, exportar para Excel e calcular totais e médias.
import json
from openpyxl import Workbook
def json_para_excel(arquivo_json, arquivo_excel):
with open(arquivo_json, 'r') as f:
dados = json.load(f)
wb = Workbook()
ws = wb.active
ws.append(["ID", "Nome", "Nota1", "Nota2", "Nota3", "Total", "Média"])
for id_aluno, info in dados.items():
nome = info[0]
notas = info[1:]
total = sum(notas)
media = total / len(notas)
ws.append([id_aluno, nome] + notas + [total, media])
wb.save(arquivo_excel)
Exercício 9: Diferenças entre Listas, Tuplas e Conjuntos
Listas são mutáveis e ordenadas, tuplas são imutáveis e ordenadas, conjuntos são mutáveis e não ordenados, com elementos únicos.
Exercício 10: Análise de Erros em Código
Identifique erros no código fornecido, como tentativa de modificar sequências imutáveis ou chaves de dicionário inexistentes.
Exercício 11: Troca de Variáveis sem Variável Temporária
Use desempacotamento para trocar valores entre variáveis.
a, b = 1, 2
a, b = b, a
Exercício 12: Resultado de Iteração em Lista
Analise por que remover elementos durante iteração pode causar comportamento inesperado.
Exercício 13: Escopo de Variáveis em Funções
Explique o resultado com base em escopo local e global.
Exercício 14: Declaração de Variáveis Globais
Demonstre o uso de global e seu impacto no código.
Exercício 15: Comparação de Dicionários
Implemente uma função que exiba chaves e valores diferentes entre dois dicionários.
def comparar_dicionarios(dict1, dict2):
diferenças = {}
todas_chaves = set(dict1.keys()).union(dict2.keys())
for chave in todas_chaves:
val1 = dict1.get(chave)
val2 = dict2.get(chave)
if val1 != val2:
diferenças[chave] = (val1, val2)
return diferenças
Exercício 16: Inversão de String
Converta uma string para ordem inversa de palavras.
texto = "Eu amo Python"
invertido = ' '.join(texto.split()[::-1])
print(invertido) # Saída: Python amo Eu
Exercício 17: Extração e Soma de Dígitos
Extraia todos os números de uma string e some-os.
import re
def somar_digitos(texto):
numeros = re.findall(r'\d+', texto)
return sum(int(num) for num in numeros)
resultado = somar_digitos("abc123def456")
print(resultado) # Saída: 579
Exercício 18: Combinações de Times com Restrições
Gere combinações de confrontso entre times, respeitando restrições específicas.
from itertools import product
time1 = ['a', 'b', 'c']
time2 = ['x', 'y', 'z']
restrições = [('a', 'x'), ('b', 'y'), ('b', 'z')]
confrontos = [(t1, t2) for t1, t2 in product(time1, time2) if (t1, t2) not in restrições]
print(confrontos)
Exercício 19: Processamento de String com Dígitos
Para uma string contendo letras e dígitos, extraia sequências onde o primeiro dígito é usado como separador para subsequências.
def processar_string(texto):
partes = []
atual = ""
for caractere in texto:
if caractere.isdigit() and atual:
partes.append(atual + caractere)
atual = ""
else:
atual += caractere
if atual:
partes.append(atual)
return partes
exemplo = "aAd123sdacD12dad2"
resultado = processar_string(exemplo)
print(resultado) # Saída: ['aAd1', 'sdacD1', 'dad2']