O que Programar com Python? 12 Desafios Para Aprender Já!

Se você está procurando projetos para aprender a programar em Python, essas sugestões vão te ajudar a saber por onde começar.

Desenvolva projetos reais que vão dar resultados rápidos e vão te permitir aprender os fundamentos de lógica de programação, as estruturas de dados e o funcionamento da linguagem Python, com uma evolução gradual.

Comece com algoritmos simples, fazendo busca e classificação, resolvendo problemas matemáticos comuns ou automatizando tarefas.

Quando você já estiver dominando variáveis, tipos de dados, laços de repetição, declarações condicionais e outras estruturas importantes, evolua para algoritmos que executam tarefas mais complexas, como resolução de problemas por força bruta, Web scraping e visualizações de dados.

Depois disso, você já poderá desenvolver sistemas Web e aplicar a linguagem Python em aprendizado de máquina, por exemplo.

Dessa forma, o seu progresso acontece de forma natural e você evita a frustração de achar que programar é muito difícil, o que é comum quando o programador iniciante começa por problemas complexos.

Por isso, nesse post eu mostro o que você pode programar em Python desde já, com ideias de projetos reais que usam a linguagem em situações onde ela é mais adequada, para que você ganhe fluência à medida que vai aprendendo.

Por que é importante ter um plano?

Para quem está começando a programar, esse direcionamento pode ser útil e economizar bastante tempo.

Mas ao mesmo tempo em que é importante conhecer todas as possibilidades de aplicação do Python, também é preciso ser realista.

Então, antes de apresentar esse conteúdo, eu deixo uma dica.

Tenha cautela com textos que mostram o Python como uma bala de prata para resolver todos os problemas, ou que falam de Inteligência Artificial como se isso fosse algo que se aprende da noite para o dia.

Talvez essa lista de usos do Python não tenha sido escrita por um programador, mas sim por alguém que só fez uma pesquisa no Google.

Portanto, antes de formar a sua opinião, dê uma olhada nesse post que detalha as situações onde eu recomendo que você não use Python, como em jogos, aplicativos móveis, interfaces gráficas nativas, ou para substituir linguagens de alta performance como C e C++.

Comece com Algoritmos Simples

Nos seus primeiros programas, procure se familiarizar com a lógica de programação e com a sintaxe da linguagem Python.

Para isso, comece resolvendo problemas computacionais e matemáticos comuns.

Nessa fase, o mais importante é conseguir dominar os conceitos básicos, como:

Para facilitar, crie programas sem interface de usuário, passando os argumentos na linha de comando ou recebendo a entrada do usuário com a função input().

Agora que você já sabe por onde começar, veja algumas sugestões do que você pode programar em Python.

E não se esqueça de tratar as ocorrências de erro em cada um dos seus programas!

!

A lista a seguir não explica a fundo como resolver cada um dos desafios propostos.

Uma das responsabilidades do programador é entender o domínio do problema antes de escrever um programa com uma solução.

Busca Linear em uma Lista não Ordenada

A busca linear é um algoritmo simples, que percorre um array de elementos não ordenados e compara cada um deles com o elemento procurado, até que encontre e retorne a sua posição.

Essa abordagem é conhecida como busca por força bruta.

No pior caso, o elemento não será encontrado mesmo depois de percorrer todas as posições do array, até a última.

Problema proposto:

Crie um programa que recebe uma lista de inteiros e um valor que deve ser buscado. O programa deve retornar o índice onde o valor foi encontrado, ou -1, caso não encontre o valor.

Busca Binária em uma Lista de Números Aleatórios

A busca binária procura um valor em uma lista ordenada, comparando o valor buscado com o valor do meio da lista.

Se o valor buscado for maior que o elemento existente no meio da lista, a busca continua de forma recursiva na metade superior da lista.

Mas se o valor buscado for menor que o elemento existente no meio da lista, a busca continua de forma recursiva na metade inferior da lista.

Problema proposto:

Escreva um programa que cria uma lista de 100 números aleatórios inteiros ordenados e solicita um número para o usuário. Use a busca binária para encontrar a posição do número fornecido na lista, ou retorne -1 se ele não for encontrado.

Algoritmo que Verifica se um Texto é um Palíndromo

De acordo com o dicionário da língua portuguesa, um palíndromo é uma palavra ou frase escrita da mesma forma da esquerda para a direita ou da direita para a esquerda.

Por exemplo, “Ana”, “arara” e “Socorram-me, subi no ônibus em Marrocos” são palíndromos.

Problema proposto:

Crie um programa que verifica se uma string é um palíndromo e retorna True ou False.

Números de Armstrong

Um número de Armstrong é um número de N dígitos onde a soma de cada dígito, elevado a N, é igual ao próprio número.

Veja um exemplo com um número de 3 dígitos em base 10:

153 = 13 + 53 + 33 =  1 + 125 + 27 = 153

Problema proposto:

Escreva um programa que imprima todos os números de Armstrong em base 10 que tenham até 6 dígitos.

Programa para Imprimir Tabelas Verdade a Partir de Expressões

Esse é um ótimo exercício para entender como funcionam os operadores lógicos e como fazer laços de repetição aninhados.

Problema proposto:

Crie um programa que receba uma expressão booleana qualquer com duas variáveis, x e y, e imprima a tabela verdade para cada valor de x e y em (True, False).

Você pode começar atribuindo cada expressão booleana que será testada a uma variável dentro do seu programa (hardcoded).

Depois, você pode evoluir o seu código, criando uma função que imprime a tabela verdade e passando uma função lambda contendo a expressão, semelhante a esse exemplo:

def tabelaVerdade(expr): # Imprimir a tabela # Teste nor = (lambda x, y: not (x or y)) tabelaVerdade(nor)

Ou então, passe só a string contendo a expressão e use a função eval() para executar o código.

!

Embora o uso da função eval() facilite a construção desse exemplo, eu sugiro que você evite usar essa função em seus programas, já que ela executa qualquer código que recebe.

Em um programa real, isso pode ser uma porta de entrada para um código malicioso.

Lei dos Grandes Números (Law of Large Numbers)

A Lei dos Grandes Números tem origem na teoria da probabilidade.

Para entender o que ela significa, sugiro que você leia esse artigo na Wikipedia.

Em resumo, na Lei dos Grandes Números, “a média aritmética dos resultados da realização da mesma experiência repetidas vezes tende a se aproximar do valor esperado à medida que mais tentativas se sucederem”.

É fácil de entender o que isso significa…

Imagine um dado com 6 lados.

A probabilidade de sair cada um dos 6 lados é de 1/6.

Então, se você jogar o dado milhares de vezes, cada resultado possível saíra em 1/6 das vezes.

A média aritmética desses resultados possíveis, (1 + 2 + 3 + 4 + 5 + 6)/6, é igual a 3,5.

Perceba que 3,5 é a média dos resultados ao longo de muitos lançamentos, não a probabilidade de sair um resultado e nem o valor de um lado do dado.

Problema proposto:

Crie um programa que simule N lançamentos de um dado de 6 lados e imprima a média aritmética dos resultados. Verifique se a média se aproxima de 3,5 à medida que o valor de N aumenta.

Automatize Tarefas Repetitivas

Agora que você já experimentou programar com o básico da linguagem Python, evolua para programas mais úteis e elaborados.

Uma tarefa importante para administradores de sistemas é gerenciar arquivos nos diretórios sem precisar ficar movendo ícones em uma interface gráfica ou rodando dezenas de comandos em um terminal.

Portanto, um script que manipula arquivos pode ser adaptado para várias finalidades, dependendo da necessidade.

Problema proposto:

Escreva um programa que crie 100 arquivos texto de 4KB com nomes e conteúdo aleatórios.

Em seguida, o programa deve renomear os arquivos em sequência, com um prefixo de 001 a 100.

Depois disso, o programa deve criar arquivos .zip com 10 arquivos texto em cada e salvar os arquivos .zip gerados a cada execução em um diretório com a estrutura ano/mês/dia/hora/minuto.

Por fim, o programa deve apagar os arquivos texto originais, caso o processamento termine sem erros.

Envie E-mails

Uma das tarefas mais comuns realizadas por um programa, seja um script de gerenciamento de arquivos de backup ou um sistema Web como o WordPress, é enviar e-mails.

Problema proposto:

Crie um programa que envia um e-mail para os endereços cadastrados, contendo o resultado da execução do programa do exemplo anterior.

Programe um Jogo da Forca em Modo Texto

Esse jogo é tão conhecido que dispensa apresentações.

Programar um jogo para rodar em um terminal é um desafio interessante, já que é preciso levar em conta a experiência do usuário na hora de jogar.

Problema proposto:

Crie um programa que escolhe uma palavra de mais de 6 letras, a partir de um texto qualquer de várias linhas, e pede ao usuário cada uma das letras até formar a palavra, permitindo um máximo de 8 erros.

Bônus: O código que contém a lógica do jogo ficou desacoplado da interface com o usuário a ponto de poder ser transferido para uma interface gráfica sem alteração?

Acesse um Conjuntos de Dados Online

Alguns programadores se organizam em comunidades para desenvolver softwares com o objetivo de fiscalizar a Administração Pública nas esferas municipal, estadual e federal.

Uma dessas iniciativas é a Operação Serenata de Amor.

Em geral, as soluções desenvolvidas por esses grupos são baseadas nos dados disponibilizados pelos órgãos públicos, conhecidos como Dados Abertos.

Esses dados são disponibilizados via Internet em formatos comuns, como JSON, XML ou CSV.

Outra fonte de dados bastante utilizada por programadores é o Kaggle, uma plataforma online com mais de 50.000 conjuntos de dados, que vão desde levantamentos de doenças no mundo todo até opiniões sobre sopa de macarrão japonesa.

Problema proposto:

Crie um programa que acessa um conjunto de dados na Internet, baixa os arquivos e monta uma tabela com as colunas do arquivo utilizado. Em seguida, salve a tabela em um banco de dados SQLite.

Gere Visualizações de Dados Interessantes

Uma vez que você tenha entendido como recuperar e processar conjuntos de dados, chegou a hora de criar visualizações sobre esses dados.

Essa é uma competência fundamental para quem quer seguir a carreira de cientista de dados.

As bibliotecas Matplotlib e Seaborn permitem construir gráficos avançados usando a linguagem Python.

Problema proposto:

Usando a lógica do problema anterior, baixe o conjunto de dados de estatísticas da NBA desde 1950 e crie gráficos que demonstrem:

1. A quantidade total de pontos dos 10 maiores pontuadores de cada temporada, ao longo dos anos, comparada com o percentual de jogos em que eles jogaram por temporada (linhas).

2. A distribuição da quantidade de bloqueios por altura do jogador, em intervalos de 10 cm de diferença (histograma).

3. A relação entre o número de faltas cometidas e o percentual de lances livres convertidos por jogador, separando por posições (scatter plot).

Crie Seus Próprios Conjuntos de Dados com Web Scraping

Agora que você já sabe como baixar e utilizar conjuntos de dados prontos da Internet, crie alguns “raspando” os sites que você visita.

Para isso, use o pacote Beautiful Soup, que permite ler os elementos de uma página HTML de forma estruturada.

Com ele, todos os dados de uma página podem ser usados para montar seu próprio conjunto de dados.

Problema proposto:

Crie um programa que acessa um site de comércio eletrônico, como o Mercado Livre, e lê todos os anúncios das 20 primeiras páginas de uma categoria. Celulares, por exemplo.

Retire todos os dados relevantes de cada página de produto, como nome do produto, preço, formas de pagamento, parcelamento, estado do produto (novo ou usado), quantidade de produtos vendidos, além dos dados do fornecedor.

Que visualizações podem gerar ideias interessantes sobre esses produtos?

!

Muitos sites usam tecnologia moderna para reduzir o risco de ataques e para tentar evitar o Web Scraping do seu conteúdo.

Portanto, aprenda a controlar o seu código para não gerar milhares de requisições por minuto, o que pode gerar um bloqueio para o seu IP.

E os Sites com Desafios de Programação?

Você já deve ter ouvido falar de sites onde é possível praticar programação por meio de desafios, como HackerRank, LeetCode e CodeWars.

Embora esses sites apresentem exercícios muito interessantes em diversas linguagens de programação, eles não são a melhor opção para quem está começando, por dois motivos:

1. Na verdade, os problemas apresentados são testes para entrevistas de emprego.

As grandes empresas de software fazem contratos com esses sites para que eles encontrem os melhores programadores do mundo.

Como consequência, os desafios são difíceis e envolvem conceitos avançados de programação.

É claro que eu não quero desanimar ninguém…

Mas, a não ser que você esteja pronto para começar a trabalhar em uma startup no Vale do Silício, esses sites vão fazer você pensar que programar é muito mais difícil do que você imaginava.

2. Por causa do ponto 1, os desafios são apresentados em um formato de competição.

Isso significa que você pode levar um mês para resolver um problema, para então perceber que outras 300 pessoas resolveram o mesmo problema em uma hora.

Isso é até natural, se você considerar que não tem como saber qual é o nível de conhecimento real de quem está competindo.

Eu não sou especialista em comportamento humano, mas a minha experiência me diz que não é uma boa ideia comparar o seu desempenho ao de outras pessoas quando você ainda está aprendendo alguma coisa.

Portanto, eu sugiro que você comece com os desafios mais simples mostrados nesse post e evolua para questões de entrevista quando já estiver dominando pelo menos a primeira linguagem de programação.

O que você achou dessas sugestões?

Sobre qual delas você quer saber mais?

Comente aí embaixo e me ajude a escolher o tema do próximo post!

Guilherme Brügger D Amato - Audiência Pública na Comissão Senado do Futuro

Guilherme Brügger D’Amato é servidor concursado de TI na Câmara dos Deputados, onde ocupou o cargo de Diretor de Informática entre 2015 e 2016. Com mais de 25 anos de experiência como programador e executivo de TI, já desenvolveu sites e sistemas usados por dezenas de milhões de pessoas. Conecte-se com ele no LinkedIn.

Deixe um comentário