Nesse exercício vamos praticar alguns conceitos sobre o ambiente e a linguagem Python.
Para a prática, vamos usar a SWAPI (https://swapi.co/
) ou The Star Wars API.
A ideia é que vamos fazer requisições para essa API e mostrar alguns resultados na tela.
Sem mais, vamos as atividades.
Aqui você pode iniciar um ambiente virtual que desejar: venv
, pipenv
, conda
.
Para instalar um pacote você usa pip install <pacote>
- Crie um arquivo
teste.py
- Importe a biblioteca
requests
- Importe a biblioteca
json
(padrão do python) - Faça uma requisição para
https://swapi.co/api/people/1/
usandorequests.get
- Converta o conteúdo JSON da requisição em um
dict
utilizando a bibliotecajson
- Imprima
Hello, <name>!
no console - Execute
python teste.py
- Deve imprimir
Hello, Luke Skywalker!
obs: ao invés de usar a biblioteca padrão do python para obter o JSON, poderíamos
usar o método r.json()
disponível na requisição da biblioteca requests
.
- Crie um arquivo
main.py
e outrostar_wars.py
- O arquivo
main.py
só deve ter a lógica de entrada e exibição de dados - O arquivo
star_wars.py
vai ter a lógica de comunicação com o SWAPI - Receba um parâmetro
nome
nomain.py
e imprima as seguintes informações:name
,height
,birth_year
e a quantidade de filmes que ele aparece.
# exemplo
python main.py --nome "Luke Skywalker"
* Nome: Luke Skywalker
* Altura: 172cm
* Ano de nascimento: 19BBY
* Quantidade de filmes: 5
python main.py --nome "Meu nome"
* Personagem "Meu nome" não encontrado
dicas:
- Uma requisição para
https://swapi.co/api/people/
retorna todos os personagens- O resultado é paginado de 10 em 10 personagens
- Portanto, se não encontrar na página atual, tem que seguir para a página no atributo
next
- A comparação dos nomes deve ser case insensitive, ou seja,
luke skywalker == LUKE SKYWALKER
Na mesma aplicação, se encontrar um personagem com um nome exatamente igual,
mostre as informações dele (feito na parte anterior).
Entretanto, permita uma pesquisa parcial do nome.
Por exemplo, python main.py --nome "Skywalker"
deve imprimir as informações de
Luke Skywalker e Anakin Skywalker.
obs: você pode optar por uma das opções:
- Opção 1:
python main.py --nome "Skywalker"
- Se encontrou um nome exatamente igual, exibe essas informações
- Se não, exibe todos os nomes que contém a pesquisa
- Opção 2:
python main.py --nome "%Skywalker%"
- Note os caractéres % no nome
- Quando esses caractéres estiverem no parâmetro de entrada, a pesquisa deve ser parcial
- Caso contrário, a pesquisa é exata
Quando recebemos entradas no formato python main.py --nome "Skywalker"
, pode ser que
ocorra um erro de digitação, por exemplo python main.py --nome "Skywaler"
.
Nesse caso, seria interessante mostrar para o usuário uma mensagem do tipo
Nenhum personagem "Skywaler" encontrado, mas encontrei: "Luke Skywalker", "Anakin Skywalker".
Para resolver esse problema, podemos usar a biblioteca fuzzywuzzy
.
Basta instalar a biblioteca e comparar as strings com
fuzz.partial_ratio('skywaler', 'Luke Skywalker')
.
Essa função retorna um "grau de confiança" entre 0 e 100.
Portanto, podemos assumir que, se houve comparação perfeita ou parcial (partes 5 e 6), você pode sugerir os nomes que tenham um grau de confiança maior que 75.
# exemplo
python main.py --nome "skywaler"
Nenhum personagem "Skywaler" encontrado, mas encontrei: "Luke Skywalker", "Anakin Skywalker"
# nesse exemplo, não encontrou nenhum personagem com nome "skywaler"
# mas ao calcular fuzz.partial_ratio('skywaler', 'Luke Skywalker')
# temos um grau de confiança de 88, logo pode ser que o usuário quis dizer "Luke Skywalker"
# ao invés de "skywaler"
# o mesmo acontece com fuzz.partial_ratio('skywaler', 'Anakin Skywalker')
Que tal tentar adicionar novos comandos ao main.py
?
Pode ser um comando para listar os n
personagens que mais aparecem em filmes.
Outro ideia é listar os filmes de forma ordenada pela quantidade de personagems que aparecem no filme.
Outras ideias? Vá em frente e tente :D