🐍 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
TipoExemplo
str"texto"
int / float10, 3.14
boolTrue, False
list[1, 2, 3]
tuple(1, 2)
dict{"nome": "Ana"}
set{1, 2, 3}
NoneNone (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
Boas práticas
  • 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.
JSON “bonito”
  • 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)