Exercícios Práticos em Python: 19 Desafios para Aprimorar Habilidades

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']

Tags: Python scripting Automação web scraping manipulação de arquivos

Publicado em 6-27 20:21