🐍 Python
✅ Guia prático
📌 Exemplos prontos
🧠 Do básico ao avançado
Python — Manual/Guia Completo
Python é uma linguagem simples, poderosa e muito usada em automação, web, dados, IA e scripts. Este manual foi feito para você aprender rápido e usar no dia a dia: instalação, sintaxe, coleções, funções, classes, venv/pip, APIs, testes e boas práticas.
🎯 Para quem é
Iniciantes, suporte/automação, devs que querem um “cheat sheet” bem organizado.
ScriptsAutomaçãoWeb🧰 O que você vai dominar
Ambiente com venv, pip, estruturas, OOP, JSON, HTTP, testes e um mini projeto CLI.
pip/venvOOPpytest🧩 Instalação e ambiente
Python • pip • venv
- Ver versão: python --version (ou python3 --version)
- pip: gerenciador de pacotes. Ex: pip install requests
- Ambiente virtual (venv): isola dependências por projeto.
# Criar e ativar venv (Windows)
python -m venv .venv
.venv\Scripts\activate
# Criar e ativar venv (Linux/macOS)
python3 -m venv .venv
source .venv/bin/activate
# Instalar dependência
pip install requests
# Salvar dependências
pip freeze > requirements.txt
# Reinstalar
pip install -r requirements.txt
Padrão profissional: sempre use .venv + requirements.txt em projetos.
Estrutura de projeto (simples)
meu_projeto/
.venv/
app.py
requirements.txt
README.md
VS Code: selecione o interpretador da .venv.
🧠 Sintaxe e fundamentos
Indentação • print • variáveis
- Python usa indentação (espaços) para delimitar blocos.
- Variáveis não precisam de tipo explícito.
- Use print() para saída e input() para entrada.
nome = "João"
idade = 30
print(f"Olá, {nome}! Você tem {idade} anos.")
# Entrada do usuário (sempre vem como string)
entrada = input("Digite um número: ")
n = int(entrada)
print(n * 2)
F-strings (formatar texto)
valor = 12.5
print(f"Total: R$ {valor:.2f}")
Comentários
# comentário de uma linha
""" comentário / docstring """
🧱 Tipos e coleções
str • int • list • dict • set
| Tipo | Exemplo |
|---|---|
| str | "texto" |
| int / float | 10, 3.14 |
| bool | True, False |
| list | [1, 2, 3] |
| tuple | (1, 2) |
| dict | {"nome": "Ana"} |
| set | {1, 2, 3} |
| None | None (ausência de valor) |
# List
nums = [10, 20, 30]
nums.append(40)
print(nums[0], nums[-1])
# Dict
user = {"name": "João", "role": "admin"}
print(user["name"])
user["active"] = True
# Set (remove duplicados)
s = {1, 2, 2, 3}
print(s)
Dica: use dict.get("chave", padrão) para evitar KeyError.
idade = user.get("age", 0)
Checar tipo:
isinstance(nums, list) # True
🔁 Controle de fluxo
if • for • while
# if/elif/else
nota = 8.5
if nota >= 9:
print("Excelente")
elif nota >= 7:
print("Aprovado")
else:
print("Reprovado")
# for
for i in range(3):
print(i)
# while
x = 0
while x < 3:
x += 1
range()
- range(5) → 0..4
- range(2, 10, 2) → 2,4,6,8
- Prefira for a while quando possível
- Evite loops infinitos
🧰 Funções
def • args • kwargs
def somar(a: int, b: int) -> int:
return a + b
def saudacao(nome: str, prefixo: str = "Olá") -> str:
return f"{prefixo}, {nome}!"
print(somar(2, 3))
print(saudacao("João"))
print(saudacao("Ana", prefixo="Bem-vinda"))
# *args e **kwargs
def log(*args, **kwargs):
print("args:", args)
print("kwargs:", kwargs)
log(1, 2, 3, level="info", tag="app")
Funções “purinhas”
- Retornam valores (sem depender de estado global)
- Ficam mais fáceis de testar
📄 Arquivos e JSON
read/write • json
# Texto
with open("dados.txt", "w", encoding="utf-8") as f:
f.write("linha 1\nlinha 2\n")
with open("dados.txt", "r", encoding="utf-8") as f:
conteudo = f.read()
print(conteudo)
# JSON
import json
obj = {"name": "João", "active": True, "roles": ["admin", "dev"]}
with open("dados.json", "w", encoding="utf-8") as f:
json.dump(obj, f, ensure_ascii=False, indent=2)
with open("dados.json", "r", encoding="utf-8") as f:
novo = json.load(f)
print(novo["roles"])
Encoding
- Use encoding="utf-8" para evitar problemas com acentos.
- indent=2 melhora leitura
- ensure_ascii=False mantém “ç/ã/é”
🧯 Erros e exceções
try • except • finally
def dividir(a: float, b: float) -> float:
if b == 0:
raise ValueError("b não pode ser zero")
return a / b
try:
print(dividir(10, 0))
except ValueError as e:
print("Erro:", e)
finally:
print("Sempre executa")
Regra prática
- Capture exceções específicas (ex: ValueError)
- Evite except: genérico
🧩 Módulos e pacotes
import • estrutura
# Exemplo de estrutura:
meu_app/
app.py
core/
__init__.py
utils.py
# core/utils.py
def slug(texto: str) -> str:
return texto.lower().replace(" ", "-")
# app.py
from core.utils import slug
print(slug("Olá Mundo"))
Pacote é uma pasta com __init__.py.
Dica: evite nomes de arquivos iguais a bibliotecas (ex: json.py).
🏛️ Classes e OOP
class • métodos • propriedades
class User:
def __init__(self, name: str, role: str = "user"):
self.name = name
self.role = role
def is_admin(self) -> bool:
return self.role == "admin"
u = User("João", "admin")
print(u.name, u.is_admin())
# Herança (simples)
class Admin(User):
def __init__(self, name: str):
super().__init__(name, role="admin")
a = Admin("Ana")
print(a.role, a.is_admin())
Quando usar classes?
- Quando há “estado” + comportamento (ex: Cliente, Pedido, Conta)
- Quando melhora organização e legibilidade
🧊 Dataclasses & typing
type hints • dataclass
from dataclasses import dataclass
@dataclass
class Produto:
nome: str
preco: float
ativo: bool = True
p = Produto("Mouse", 79.90)
print(p)
# typing
from typing import Optional
def buscar(nome: str) -> Optional[str]:
if nome == "x":
return None
return "ok"
Por que usar typing?
- Ajuda o VS Code a sugerir melhor
- Reduz bugs em projetos grandes
- Melhora a documentação do código
⚡ Comprehensions
list/dict/set
nums = [1, 2, 3, 4, 5]
pares = [n for n in nums if n % 2 == 0]
quadrados = {n: n*n for n in nums}
unicos = {n for n in [1,1,2,3,3,4]}
print(pares)
print(quadrados)
print(unicos)
Regra prática
- Use comprehension quando ficar mais curto e claro
- Se ficar grande, volte para for normal
🧵 Async (asyncio)
await • tasks
import asyncio
async def tarefa(nome: str, t: float):
await asyncio.sleep(t)
return f"{nome} terminou"
async def main():
r1 = asyncio.create_task(tarefa("A", 1.0))
r2 = asyncio.create_task(tarefa("B", 0.5))
print(await r1)
print(await r2)
asyncio.run(main())
Quando usar async?
- Muitas chamadas de rede (HTTP/APIs)
- IO intensivo (não CPU)
- Para CPU, pense em threads/processos
🌐 HTTP / APIs
requests • JSON
# pip install requests
import requests
resp = requests.get("https://api.github.com")
print(resp.status_code)
print(resp.headers.get("content-type"))
data = resp.json()
print(list(data.keys())[:5])
# POST JSON
payload = {"name": "João", "role": "admin"}
r = requests.post("https://httpbin.org/post", json=payload, timeout=10)
print(r.json()["json"])
Boas práticas
- Use timeout em requests
- Trate erros (status_code)
- Evite hardcode de tokens (use env vars)
🧪 Testes (pytest)
testes rápidos
# pip install pytest
# arquivo: calc.py
def somar(a, b):
return a + b
# arquivo: test_calc.py
from calc import somar
def test_somar():
assert somar(2, 3) == 5
# rodar:
pytest -q
Por que testar?
- Evita regressões
- Facilita refatoração
- Documenta comportamento
✅ Boas práticas
clean code
- PEP 8: padrão de estilo (nomes, espaçamento, linhas).
- Linters: use ruff ou flake8 (opcional).
- Formatador: black (opcional).
- Logs: prefira logging em vez de prints em produção.
- Config: use variáveis de ambiente (os.environ).
# logging básico
import logging
logging.basicConfig(level=logging.INFO)
logging.info("App iniciado")
Checklist
- .venv + requirements.txt
- Funções pequenas e claras
- Tratamento de erro
- Testes para partes críticas
- README simples
Evite: misturar regras de negócio com código de interface/entrada/saída no mesmo bloco gigante.
📦 Mini projeto (CLI) — Gerenciador de tarefas
JSON • funções • estrutura
Um exemplo realista: um “todo” simples via terminal que salva tarefas em tasks.json.
# arquivo: todo.py
import json
from pathlib import Path
DB = Path("tasks.json")
def load_tasks():
if not DB.exists():
return []
return json.loads(DB.read_text(encoding="utf-8"))
def save_tasks(tasks):
DB.write_text(json.dumps(tasks, ensure_ascii=False, indent=2), encoding="utf-8")
def add_task(title):
tasks = load_tasks()
tasks.append({"title": title, "done": False})
save_tasks(tasks)
def list_tasks():
tasks = load_tasks()
if not tasks:
print("Sem tarefas.")
return
for i, t in enumerate(tasks, start=1):
status = "✅" if t["done"] else "🕒"
print(f"{i}. {status} {t['title']}")
def done_task(index):
tasks = load_tasks()
i = index - 1
if i < 0 or i >= len(tasks):
print("Índice inválido.")
return
tasks[i]["done"] = True
save_tasks(tasks)
def main():
print("Todo CLI")
print("1) Listar 2) Adicionar 3) Concluir 4) Sair")
while True:
op = input("> ").strip()
if op == "1":
list_tasks()
elif op == "2":
title = input("Título: ").strip()
if title:
add_task(title)
elif op == "3":
n = int(input("Número da tarefa: "))
done_task(n)
elif op == "4":
break
else:
print("Opção inválida.")
if __name__ == "__main__":
main()
Como rodar
python todo.py
Próximas melhorias
- Remover tarefa
- Editar título
- Filtro (pendentes/concluídas)
- CLI com argparse (profissional)