Ficha 02 · Módulos, JSON, APIs e testes
- Criar módulos
- Ler/escrever JSON e CSV
- Chamar APIs
- Escrever testes pytest
Parte I · Módulos
Exercício 1 · Organizar projecto (10 pts)
Tens um ficheiro de 800 linhas com tudo dentro. Propõe estrutura para dividir em módulos:
loja.py (800 linhas)
Exercício 2 · pip e virtualenv (15 pts)
Descreve passos para começar um projecto Python novo com:
- Ambiente virtual isolado.
- 3 dependências (requests, pytest, rich).
- Ficheiro requirements.txt.
Parte II · JSON e CSV
Exercício 3 · Manipular JSON (15 pts)
Dado um ficheiro alunos.json:
[
{"nome": "Ana", "notas": [15, 16, 14]},
{"nome": "João", "notas": [10, 12, 13]}
]
Escreve programa que:
a) Lê o ficheiro.
b) Calcula a média de cada aluno.
c) Adiciona campo media a cada aluno.
d) Grava de volta.
Exercício 4 · CSV → JSON (10 pts)
Dado vendas.csv:
data,produto,qty,preco
2026-05-01,Caneta,10,1.50
2026-05-02,Caderno,5,3.20
Converte para vendas.json com mesma estrutura. Calcula campo extra total (qty × preco).
Parte III · APIs
Exercício 5 · Consumir API (15 pts)
Usa a API pública https://api.github.com/users/{username} para mostrar info de um utilizador GitHub:
a) Lê username do input.
b) Faz GET à API.
c) Mostra name, bio, public_repos, followers.
d) Trata erros (utilizador não existe, sem internet).
Exercício 6 · API com paginação (15 pts)
A API GitHub limita resultados por página (30 por defeito). Para listar todos os repos de um utilizador, é preciso paginar.
Implementa função que devolve todos os repos, iterando páginas até esgotar:
Parte IV · Testes
Exercício 7 · Escrever testes (20 pts)
Para a seguinte função, escreve 4 testes pytest cobrindo casos normais e erros:
def media_ponderada(notas, pesos):
if len(notas) != len(pesos):
raise ValueError("Notas e pesos têm de ter mesmo tamanho")
if sum(pesos) == 0:
raise ValueError("Soma de pesos não pode ser 0")
soma = sum(n * p for n, p in zip(notas, pesos))
return soma / sum(pesos)