Laboratório de Programação — Ciência da Computação
PEP 8, legibilidade, testes, tratamento de exceções, módulos, pacotes, imports e ambientes virtuais.
Dica Adote um guia de estilo (PEP 8) e automatize checagens no CI.
# bom
def calcular_media(notas: list[float]) -> float:
return sum(notas) / len(notas)
# ruim
def f(x): return x*x + 2*x + 1
# bom
def parabola(valor: float) -> float:
return valor*valor + 2*valor + 1
def calcular_fatorial(n: int) -> int:
"""Calcula o fatorial de n (n >= 0).
Retorna:
int: n!
"""
if n < 0:
raise ValueError("n deve ser não-negativo")
return 1 if n == 0 else n * calcular_fatorial(n-1)
Use docstrings para o quê e por quê. Comentários em linha para o como quando necessário.
meu_projeto/
├─ meu_projeto/
│ ├─ __init__.py
│ ├─ dominio/
│ │ ├─ __init__.py
│ │ └─ pedidos.py
│ ├─ infra/
│ │ ├─ __init__.py
│ │ └─ repositorio.py
│ └─ app.py
├─ tests/
│ └─ test_pedidos.py
└─ requirements.txt
def ler_inteiro(prompt="Digite um número inteiro: ") -> int:
while True:
valor = input(prompt).strip()
if valor.lstrip("-").isdigit():
return int(valor)
print("Entrada inválida. Tente novamente.")
from pathlib import Path
def carregar_arquivo(caminho: str) -> str:
try:
return Path(caminho).read_text(encoding="utf-8")
except FileNotFoundError:
return "Arquivo não encontrado."
except OSError as e:
return f"Erro de I/O: {e}"
Capture apenas o que você sabe tratar; registre o restante.
from pathlib import Path
def salvar_texto(caminho: str, conteudo: str) -> None:
p = Path(caminho)
p.parent.mkdir(parents=True, exist_ok=True)
p.write_text(conteudo, encoding="utf-8")
# centralize lógica comum em funções
def media(valores: list[float]) -> float:
return sum(valores)/len(valores) if valores else 0.0
# tests/test_media.py
import pytest
from meu_projeto.dominio.pedidos import media
def test_media_lista():
assert media([1,2,3]) == 2
def test_media_vazia():
assert media([]) == 0.0
Use pytest, mocks para I/O e rode no CI.
def calcular_imposto(salario: float) -> float:
"""Calcula IR estimado (didático).
Parâmetros:
salario (float): salário bruto.
Retorno:
float: imposto devido.
"""
return max(salario * 0.15, 0.0)
def faixa_etaria(idade: int) -> str:
if idade < 0:
raise ValueError("Idade inválida")
if idade < 18:
return "menor"
if idade <= 65:
return "adulto"
return "idoso"
def coletar_nomes():
nomes = []
while True:
nome = input("Nome (ou 'sair'): ").strip()
if nome.lower() == "sair":
break
if nome:
nomes.append(nome)
return nomes
def calcular_area_retangulo(larg: float, comp: float) -> float:
return larg * comp
def salario_liquido(bruto: float, descontos: float) -> float:
return bruto - descontos
def dobrar_lista(nums: list[int]) -> list[int]:
# retorna nova lista, não muta a original
return [n*2 for n in nums]
# modulo1.py
def saudacao(nome: str) -> None:
print(f"Olá, {nome}!")
def soma(a: float, b: float) -> float:
return a + b
# programa_principal.py
import modulo1
modulo1.saudacao("Mundo")
print(modulo1.soma(2, 3))
meu_app/
├─ __init__.py
├─ contas/
│ ├─ __init__.py
│ ├─ banco.py
│ └─ investimentos.py
└─ utils/
├─ __init__.py
└─ datas.py
from meu_app.contas import banco, investimentos
# meu_app/__init__.py
__all__ = ["contas", "utils"]
Controla o que é exposto em from meu_app import * e pode conter código de inicialização do pacote.
import modulo1
from modulo1 import saudacao, soma
import modulo1 as md1
# evitar na maioria dos casos:
# from modulo1 import *
Namespaces evitam conflitos. Prefira imports explícitos.
import math, random, os, sys, json, csv, re, datetime
print(math.sqrt(16)) # 4.0
print(random.randint(1,3))# 1..3
print(os.getcwd()) # diretório atual
# instalar
pip install numpy pandas requests
# requirements
pip freeze > requirements.txt
pip install -r requirements.txt
import pandas as pd
df = pd.DataFrame({"Nome":["Ana","Bob"], "Idade":[20,22]})
print(df)
Isolam dependências por projeto, evitam conflitos e facilitam a portabilidade.
| Característica | venv | virtualenv |
|---|---|---|
| Padrão no Python | Sim (3.3+) | Não |
| Facilidade | Integrado e simples | Mais recursos |
| Compatibilidade | Python 3.3+ | Versões antigas também |
cd meu_projeto
python -m venv .venv
# ativar
# Linux/macOS:
source .venv/bin/activate
# Windows:
# .venv\Scripts\activate
pip install -r requirements.txt
deactivate
numpy==2.1.0
pandas==2.2.2
requests==2.32.0
sorted)nums = [1,2,3,4,5]
soma = sum(nums) # em vez de loop manual
ordenado = sorted(nums) # Timsort otimizado
import time
t0 = time.perf_counter()
# ... código ...
dt = time.perf_counter() - t0
print(f"Tempo: {dt:.6f}s")
Mensure antes de otimizar. Use cProfile para perfis detalhados.
Comece simples, automatize checagens e evolua continuamente.