Python Study Hub ⚛️

← Intro
Progresso 0 / 16 seções concluídas

👋 Entrada de Dados & F-Strings

Em Python, input() lê texto digitado pelo usuário. As f-strings (prefixo f"...") permitem inserir variáveis diretamente dentro de strings com {variável}.

📌 Básico — Input e f-string

nome = input("Seu nome: ")
print(f"Olá, {nome}!")

📌 Intermediário — Formatação numérica

preco = 19.5
quantidade = 3
total = preco * quantidade
print(f"Total: R$ {total:.2f}")

🧠 Quiz rápido

Qual é a saída de: x = 5; print(f"Valor: {x*2}")?

⚙️ Funções

Funções encapsulam código reutilizável. Use def para definir, return para retornar valor. Podem ter parâmetros opcionais com valores padrão.

📌 Básico — Função com retorno

def somar(a, b):
    return a + b

print(somar(10, 5))

📌 Intermediário — Parâmetro padrão

def saudar(nome, saudacao="Olá"):
    return f"{saudacao}, {nome}!"

print(saudar("Ana"))
print(saudar("João", "Oi"))

🧠 Quiz rápido

O que imprime: def dobro(n): return n*2; print(dobro(4))?

📂 Listas

Listas são coleções ordenadas e mutáveis. Use append() para adicionar, remove() para remover, e índices para acessar elementos.

📌 Básico — Criar e adicionar

frutas = ["Maçã", "Banana"]
frutas.append("Laranja")
print(frutas)

📌 Intermediário — List comprehension

numeros = [1, 2, 3, 4, 5]
pares = [n for n in numeros if n % 2 == 0]
dobros = [n * 2 for n in numeros]
print("Pares:", pares)
print("Dobros:", dobros)

🧠 Quiz rápido

Qual é o resultado de [x**2 for x in range(3)]?

🔑 Dicionários

Dicionários armazenam pares chave-valor. São ideais para estruturar dados como objetos. Acesse com dict["chave"] ou dict.get("chave").

📌 Básico — Criar e acessar

carro = {"marca": "Ford", "ano": 2022}
print(carro["marca"])

📌 Intermediário — Iterar e atualizar

pessoa = {"nome": "Ana", "idade": 25}
pessoa["cidade"] = "SP"

for chave, valor in pessoa.items():
    print(f"{chave}: {valor}")

🧠 Quiz rápido

Como acessar com segurança uma chave que pode não existir?

🔄 Loops

Use for para iterar sobre sequências e while para repetir enquanto uma condição for verdadeira. range(n) gera sequências numéricas.

📌 Básico — For com range

for i in range(3):
    print(f"Número: {i}")

📌 Intermediário — While + break

contador = 0
while contador < 5:
    print(f"Contando: {contador}")
    contador += 1
    if contador == 3:
        print("Parei no 3!")
        break

🧠 Quiz rápido

Quantas vezes o print executa: for i in range(1, 5): print(i)?

⚠️ Tratamento de Erros

Use try/except para capturar erros sem travar o programa. O bloco finally sempre executa, independente de erro.

📌 Básico — Try/Except

try:
    x = 1 / 0
except ZeroDivisionError:
    print("Não divida por zero!")

📌 Intermediário — Múltiplos erros + finally

def dividir(a, b):
    try:
        resultado = a / b
        return resultado
    except ZeroDivisionError:
        print("Erro: divisão por zero")
    except TypeError:
        print("Erro: tipo inválido")
    finally:
        print("Operação finalizada")

dividir(10, 2)
dividir(5, 0)

🧠 Quiz rápido

O bloco finally executa:

🏗️ POO — Classes e Objetos

Classes são moldes para criar objetos. __init__ é o construtor. self referencia a instância atual do objeto.

📌 Básico — Classe simples

class Pessoa:
    def __init__(self, nome):
        self.nome = nome

p = Pessoa("Maria")
print(p.nome)

📌 Intermediário — Método e herança

class Animal:
    def __init__(self, nome):
        self.nome = nome

    def falar(self):
        return "..."

class Cachorro(Animal):
    def falar(self):
        return f"{self.nome} diz: Au au!"

dog = Cachorro("Rex")
print(dog.falar())

🧠 Quiz rápido

O que é self em uma classe Python?

📊 Pandas

Pandas é a biblioteca principal para análise de dados em Python. Um DataFrame é como uma tabela com linhas e colunas nomeadas.

📌 Básico — Criar DataFrame

import pandas as pd
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
print(df)

📌 Intermediário — Filtro e estatísticas

import pandas as pd

dados = {"nome": ["Ana", "João", "Pedro"],
         "nota": [8.5, 6.0, 9.2]}
df = pd.DataFrame(dados)

aprovados = df[df["nota"] >= 7]
print("Aprovados:")
print(aprovados)
print(f"\nMédia: {df['nota'].mean():.1f}")

🧠 Quiz rápido

Como filtrar um DataFrame df onde a coluna "idade" é maior que 18?

📄 Arquivos

Python usa open() para ler e escrever arquivos. O modo "r" lê, "w" escreve (sobrescreve), "a" adiciona ao final. Use with para fechar automaticamente.

📌 Básico — Ler e escrever

# Escrever em arquivo
with open("notas.txt", "w") as f:
    f.write("Linha 1\n")
    f.write("Linha 2\n")

# Ler arquivo
with open("notas.txt", "r") as f:
    conteudo = f.read()
    print(conteudo)

📌 Intermediário — Ler linha por linha

linhas = ["Ana - 8.5\n", "João - 6.0\n", "Pedro - 9.2\n"]

with open("alunos.txt", "w") as f:
    f.writelines(linhas)

with open("alunos.txt", "r") as f:
    for i, linha in enumerate(f, 1):
        print(f"Linha {i}: {linha.strip()}")

🧠 Quiz rápido

Qual modo do open() adiciona conteúdo ao final sem apagar o existente?

🔍 Expressões Regulares

O módulo re permite buscar padrões em textos. re.search() encontra a primeira ocorrência, re.findall() retorna todas, re.sub() substitui.

📌 Básico — Buscar padrão

import re

texto = "Meu email é [email protected]"
padrao = r"\w+@\w+\.\w+"

resultado = re.search(padrao, texto)
if resultado:
    print("Email encontrado:", resultado.group())

📌 Intermediário — findall e sub

import re

texto = "Os preços são R$10, R$25 e R$100"

# Encontrar todos os valores
valores = re.findall(r"R\$\d+", texto)
print("Valores:", valores)

# Substituir números por ***
censurado = re.sub(r"\d+", "***", texto)
print("Censurado:", censurado)

🧠 Quiz rápido

Qual função do re retorna uma lista com todas as ocorrências do padrão?

🌐 Requests & APIs

A biblioteca requests facilita chamadas HTTP. Use requests.get(url) para buscar dados de APIs. A resposta pode ser convertida para JSON com .json().

📌 Básico — GET em uma API pública

import requests

url = "https://api.github.com/users/github"
resposta = requests.get(url)

if resposta.status_code == 200:
    dados = resposta.json()
    print("Nome:", dados["name"])
    print("Seguidores:", dados["followers"])
else:
    print("Erro:", resposta.status_code)

📌 Intermediário — POST com dados

import requests

url = "https://httpbin.org/post"
payload = {"nome": "Ana", "idade": 25}
headers = {"Content-Type": "application/json"}

resposta = requests.post(url, json=payload, headers=headers)
dados = resposta.json()
print("Enviado:", dados["json"])

🧠 Quiz rápido

Qual código HTTP indica que uma requisição foi bem-sucedida?

✨ Decorators

Decorators são funções que envolvem outras funções para adicionar comportamento sem modificar o código original. Usados com a sintaxe @nome_decorator.

📌 Básico — Criar um decorator

def meu_decorator(func):
    def wrapper():
        print("--- Antes da função ---")
        func()
        print("--- Depois da função ---")
    return wrapper

@meu_decorator
def saudar():
    print("Olá, mundo!")

saudar()

📌 Intermediário — Decorator com timer

import time

def cronometrar(func):
    def wrapper(*args, **kwargs):
        inicio = time.time()
        resultado = func(*args, **kwargs)
        fim = time.time()
        print(f"{func.__name__} levou {fim - inicio:.4f}s")
        return resultado
    return wrapper

@cronometrar
def calcular():
    total = sum(range(1_000_000))
    return total

print("Total:", calcular())

🧠 Quiz rápido

O que a sintaxe @meu_decorator acima de uma função faz?

🔢 NumPy

NumPy é a biblioteca fundamental para computação numérica em Python. Oferece arrays multidimensionais eficientes e funções matemáticas de alto desempenho.

📌 Básico — Arrays e operações elementares

import numpy as np

# Criar arrays
a = np.array([1, 2, 3, 4, 5])
b = np.array([10, 20, 30, 40, 50])

# Operações vetorizadas (sem loop!)
print("Soma:", a + b)
print("Dobro de a:", a * 2)
print("Média:", np.mean(a))
print("Desvio padrão:", np.std(a))

# Array 2D (matriz)
matriz = np.array([[1, 2, 3], [4, 5, 6]])
print("Shape:", matriz.shape)
print("Soma de todas as colunas:", np.sum(matriz, axis=0))

📌 Intermediário — Indexação, slicing e funções úteis

import numpy as np

# arange e linspace
numeros = np.arange(0, 10, 2)        # [0, 2, 4, 6, 8]
espacados = np.linspace(0, 1, 5)     # 5 valores entre 0 e 1

print("arange:", numeros)
print("linspace:", espacados)

# Indexação booleana
dados = np.array([15, 3, 42, 8, 27, 6])
maiores = dados[dados > 10]
print("Maiores que 10:", maiores)

# Reshape
v = np.arange(12)
m = v.reshape(3, 4)
print("Matriz 3x4:\n", m)

# Operações matriciais
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print("Produto matricial:\n", A @ B)

🧠 Quiz rápido

O que np.array([1,2,3]) * 3 retorna?

📈 Matplotlib

Matplotlib é a principal biblioteca de visualização de dados em Python. Com ela você cria gráficos de linha, barras, pizza, dispersão e muito mais.

📌 Básico — Gráfico de linha e barras

import matplotlib
matplotlib.use('Agg')  # necessário no Pyodide
import matplotlib.pyplot as plt
import numpy as np

# Gráfico de linha
x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure(figsize=(8, 4))
plt.plot(x, y, color='royalblue', linewidth=2, label='sen(x)')
plt.title('Onda Senoidal')
plt.xlabel('x')
plt.ylabel('sen(x)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('grafico.png', dpi=100)
plt.show()
print("Gráfico gerado!")

📌 Intermediário — Múltiplos subplots

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(1, 3, figsize=(12, 4))

# Gráfico de barras
categorias = ['Jan', 'Fev', 'Mar', 'Abr']
valores = [23, 45, 31, 60]
axes[0].bar(categorias, valores, color='steelblue')
axes[0].set_title('Vendas Mensais')

# Gráfico de dispersão
x = np.random.randn(50)
y = x * 2 + np.random.randn(50)
axes[1].scatter(x, y, alpha=0.6, color='tomato')
axes[1].set_title('Dispersão')

# Histograma
dados = np.random.normal(0, 1, 500)
axes[2].hist(dados, bins=25, color='mediumseagreen', edgecolor='white')
axes[2].set_title('Histograma Normal')

plt.tight_layout()
plt.savefig('subplots.png')
plt.show()
print("Subplots gerados!")

🧠 Quiz rápido

Qual função do Matplotlib cria múltiplos gráficos lado a lado?

🗄️ SQLite

SQLite é um banco de dados relacional embutido no Python — sem necessidade de instalar nada. Ideal para apps locais, protótipos e aprender SQL.

📌 Básico — Criar banco, inserir e consultar

import sqlite3

# Conectar (cria o arquivo se não existir)
conn = sqlite3.connect(':memory:')  # banco em memória
cursor = conn.cursor()

# Criar tabela
cursor.execute('''
    CREATE TABLE usuarios (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        nome TEXT NOT NULL,
        idade INTEGER
    )
''')

# Inserir dados
cursor.executemany('INSERT INTO usuarios (nome, idade) VALUES (?, ?)', [
    ('Ana', 28),
    ('Bruno', 35),
    ('Carla', 22),
])
conn.commit()

# Consultar
cursor.execute('SELECT * FROM usuarios WHERE idade > 25')
for row in cursor.fetchall():
    print(row)

conn.close()

📌 Intermediário — UPDATE, DELETE e usar com Pandas

import sqlite3
import pandas as pd

conn = sqlite3.connect(':memory:')
cursor = conn.cursor()

cursor.execute('CREATE TABLE produtos (id INTEGER PRIMARY KEY, nome TEXT, preco REAL, estoque INTEGER)')
cursor.executemany('INSERT INTO produtos VALUES (?,?,?,?)', [
    (1, 'Caneta', 1.50, 100),
    (2, 'Caderno', 12.90, 50),
    (3, 'Mochila', 89.90, 10),
])
conn.commit()

# UPDATE
cursor.execute('UPDATE produtos SET preco = preco * 1.1 WHERE estoque < 20')
conn.commit()
print("Reajuste de 10% em produtos com pouco estoque")

# DELETE
cursor.execute('DELETE FROM produtos WHERE preco < 5')
conn.commit()

# Ler com Pandas
df = pd.read_sql_query('SELECT * FROM produtos ORDER BY preco', conn)
print(df)

conn.close()

🧠 Quiz rápido

Por que usar ? em vez de concatenar strings em queries SQLite?

⚡ FastAPI

FastAPI é um framework moderno e rápido para criar APIs REST com Python. Usa type hints para validação automática e gera documentação interativa automaticamente.

📌 Básico — Criar uma API simples

# Para rodar: pip install fastapi uvicorn
# Salve como main.py e execute: uvicorn main:app --reload

from fastapi import FastAPI

app = FastAPI()

# Rota GET simples
@app.get("/")
def raiz():
    return {"mensagem": "Bem-vindo à minha API!"}

# Rota com parâmetro de path
@app.get("/usuarios/{user_id}")
def buscar_usuario(user_id: int):
    return {"id": user_id, "nome": f"Usuário {user_id}"}

# Rota com query params
@app.get("/produtos")
def listar_produtos(categoria: str = "todos", limite: int = 10):
    return {"categoria": categoria, "limite": limite}

# Documentação automática em: http://localhost:8000/docs

📌 Intermediário — POST com Pydantic e validação

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
from typing import Optional

app = FastAPI()

# Modelo de dados com validação automática
class Produto(BaseModel):
    nome: str = Field(..., min_length=2, max_length=100)
    preco: float = Field(..., gt=0)
    estoque: int = Field(default=0, ge=0)
    descricao: Optional[str] = None

# Banco fake em memória
db: dict[int, Produto] = {}
contador = 0

@app.post("/produtos", status_code=201)
def criar_produto(produto: Produto):
    global contador
    contador += 1
    db[contador] = produto
    return {"id": contador, **produto.model_dump()}

@app.get("/produtos/{produto_id}")
def buscar_produto(produto_id: int):
    if produto_id not in db:
        raise HTTPException(status_code=404, detail="Produto não encontrado")
    return db[produto_id]

@app.delete("/produtos/{produto_id}")
def deletar_produto(produto_id: int):
    if produto_id not in db:
        raise HTTPException(status_code=404, detail="Produto não encontrado")
    del db[produto_id]
    return {"mensagem": "Produto removido"}

# Testar em: http://localhost:8000/docs

🧠 Quiz rápido

Qual é a principal vantagem de usar modelos Pydantic no FastAPI?

🚀 Playground Python

Execute código Python diretamente no navegador! Usa Pyodide (Python em WebAssembly). Pandas e NumPy são suportados. Use Ctrl+Enter para executar.
💡 Ctrl+Enter executar · ↑↓ histórico · Pandas e NumPy disponíveis
▸ Aguardando execução...
📲
Instalar Python Study Hub Acesse offline como app no seu dispositivo