Cheatsheet Python em Português: Referência Rápida | Python Brasil

Cheatsheet completo de Python em português: list comprehensions, decoradores, type hints, async/await, f-strings e mais. Referência rápida 2026.

Cheatsheet Python — Referência Rápida em Português

Esta página é sua referência rápida para a linguagem Python. Aqui você encontra exemplos práticos e concisos de tudo que precisa no dia a dia — de variáveis básicas até async/await. Salve nos favoritos e consulte sempre que precisar.


1. Variáveis e Tipos

Python é dinamicamente tipado, mas suporta type hints para documentação e verificação estática. Para um guia completo sobre tipagem estática, veja nosso post sobre tipagem estática com mypy.

# Tipos básicos
nome: str = "Maria"
idade: int = 30
altura: float = 1.72
ativo: bool = True
nada: None = None

# Verificação de tipo em tempo de execução
print(type(nome))           # <class 'str'>
print(isinstance(idade, int))  # True
print(isinstance(42, (int, float)))  # True — aceita tupla de tipos

# Type hints avançados (módulo typing)
from typing import Union, Optional

def buscar_usuario(id: int) -> Optional[str]:
    """Retorna o nome do usuário ou None se não encontrado."""
    usuarios = {1: "Ana", 2: "Carlos"}
    return usuarios.get(id)

# Union para múltiplos tipos
def processar(valor: Union[int, str]) -> str:
    return str(valor)

# Python 3.10+ — sintaxe simplificada com |
def processar_novo(valor: int | str) -> str:
    return str(valor)

# Coleções tipadas
from typing import TypeAlias

Coordenada: TypeAlias = tuple[float, float]
ponto: Coordenada = (23.55, -46.63)

nomes: list[str] = ["Ana", "Bruno", "Clara"]
config: dict[str, int] = {"timeout": 30, "retries": 3}

2. Controle de Fluxo

# if / elif / else
nota = 8.5
if nota >= 9:
    conceito = "A"
elif nota >= 7:
    conceito = "B"
elif nota >= 5:
    conceito = "C"
else:
    conceito = "D"

# Operador ternário
status = "aprovado" if nota >= 7 else "reprovado"

# Walrus operator (:=) — Python 3.8+
dados = [1, 2, 3, 4, 5, 6, 7, 8]
if (n := len(dados)) > 5:
    print(f"Lista grande com {n} elementos")

# while com walrus operator
import re
texto = "contato: email@teste.com e admin@site.com.br"
padrao = re.compile(r'[\w.]+@[\w.]+')
pos = 0
while (match := padrao.search(texto, pos)):
    print(f"Email encontrado: {match.group()}")
    pos = match.end()

# for com range e enumerate
frutas = ["maçã", "banana", "manga"]
for i, fruta in enumerate(frutas, start=1):
    print(f"{i}. {fruta}")

# break e continue
for num in range(100):
    if num % 2 == 0:
        continue  # pula pares
    if num > 10:
        break      # para no 11
    print(num)

# match-case — Python 3.10+ (structural pattern matching)
def analisar_comando(comando: str) -> str:
    match comando.split():
        case ["sair"]:
            return "Encerrando..."
        case ["mover", direcao]:
            return f"Movendo para {direcao}"
        case ["atacar", alvo, *modificadores]:
            mods = ", ".join(modificadores) if modificadores else "nenhum"
            return f"Atacando {alvo} com modificadores: {mods}"
        case _:
            return "Comando desconhecido"

print(analisar_comando("mover norte"))       # Movendo para norte
print(analisar_comando("atacar dragão fogo"))  # Atacando dragão com modificadores: fogo

3. Funções

Funções são objetos de primeira classe em Python. Veja também nosso glossário sobre decorators para se aprofundar no tema.

# Função com type hints e valor padrão
def saudacao(nome: str, formal: bool = False) -> str:
    if formal:
        return f"Prezado(a) {nome}, bom dia."
    return f"Oi, {nome}!"

# *args e **kwargs
def log_evento(*args: str, **kwargs: str) -> None:
    print("Argumentos:", args)
    print("Opções:", kwargs)

log_evento("login", "sucesso", usuario="ana", ip="192.168.1.1")

# Lambda
quadrado = lambda x: x ** 2
ordenar_por_idade = sorted(
    [("Ana", 30), ("Bruno", 25)],
    key=lambda p: p[1]
)

# Closures
def criar_multiplicador(fator: int):
    def multiplicar(n: int) -> int:
        return n * fator
    return multiplicar

dobro = criar_multiplicador(2)
print(dobro(5))  # 10

# Decorators
import functools
import time

def cronometrar(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        inicio = time.perf_counter()
        resultado = func(*args, **kwargs)
        fim = time.perf_counter()
        print(f"{func.__name__} executou em {fim - inicio:.4f}s")
        return resultado
    return wrapper

@cronometrar
def processar_dados(n: int) -> list[int]:
    return [i ** 2 for i in range(n)]

# functools — partial e lru_cache
from functools import partial, lru_cache

potencia_de_2 = partial(pow, 2)
print(potencia_de_2(10))  # 1024

@lru_cache(maxsize=128)
def fibonacci(n: int) -> int:
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(50))  # 12586269025 — calculado instantaneamente com cache

4. Estruturas de Dados

Para uso avançado de dataclasses, confira nosso guia completo de dataclasses.

# List — mutável e ordenada
numeros = [3, 1, 4, 1, 5]
numeros.append(9)
numeros.sort()
fatiado = numeros[1:4]  # [1, 3, 4]

# Dict — pares chave-valor
pessoa = {"nome": "Ana", "idade": 30}
pessoa["cidade"] = "São Paulo"
nome = pessoa.get("nome", "desconhecido")

# Set — valores únicos, sem ordem
tags = {"python", "web", "api"}
tags.add("django")
comuns = tags & {"python", "java"}  # interseção: {"python"}

# Tuple — imutável
coordenada = (-23.55, -46.63)
lat, lon = coordenada  # unpacking

# collections — deque, defaultdict, Counter, namedtuple
from collections import deque, defaultdict, Counter, namedtuple

# deque — fila de alta performance
fila = deque(maxlen=3)
fila.append("a")
fila.append("b")
fila.append("c")
fila.append("d")  # "a" é removido automaticamente
print(list(fila))  # ['b', 'c', 'd']

# defaultdict — valor padrão automático
contagem_letras = defaultdict(int)
for letra in "abracadabra":
    contagem_letras[letra] += 1

# Counter — contagem direta
palavras = ["python", "java", "python", "go", "python", "java"]
ranking = Counter(palavras)
print(ranking.most_common(2))  # [('python', 3), ('java', 2)]

# namedtuple
Ponto = namedtuple("Ponto", ["x", "y"])
p = Ponto(3, 4)
print(f"x={p.x}, y={p.y}")

# dataclasses — a forma moderna
from dataclasses import dataclass, field

@dataclass
class Produto:
    nome: str
    preco: float
    tags: list[str] = field(default_factory=list)

    @property
    def preco_formatado(self) -> str:
        return f"R$ {self.preco:.2f}"

cafe = Produto("Café", 12.90, ["bebida", "quente"])
print(cafe.preco_formatado)  # R$ 12.90

5. List Comprehensions e Geradores

Para uma explicação detalhada, visite nosso glossário sobre list comprehension.

# List comprehension
pares = [x for x in range(20) if x % 2 == 0]
quadrados = [x ** 2 for x in range(10)]

# List comprehension aninhada
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
achatada = [num for linha in matriz for num in linha]

# Dict comprehension
nomes = ["ana", "bruno", "clara"]
tamanhos = {nome: len(nome) for nome in nomes}
# {'ana': 3, 'bruno': 5, 'clara': 5}

# Set comprehension
iniciais = {nome[0].upper() for nome in nomes}  # {'A', 'B', 'C'}

# Generator expression — avaliação preguiçosa (lazy)
soma_grandes = sum(x ** 2 for x in range(1_000_000) if x % 3 == 0)

# Função geradora com yield
def ler_em_blocos(arquivo: str, tamanho: int = 1024):
    with open(arquivo, "r") as f:
        while (bloco := f.read(tamanho)):
            yield bloco

# itertools essenciais
import itertools

# chain — concatena iteráveis
todos = list(itertools.chain([1, 2], [3, 4], [5]))  # [1, 2, 3, 4, 5]

# islice — fatiamento de iteradores
primeiros_5 = list(itertools.islice(range(100), 5))  # [0, 1, 2, 3, 4]

# groupby — agrupar elementos ordenados
dados = [("fruta", "maçã"), ("legume", "cenoura"), ("fruta", "banana")]
dados.sort(key=lambda x: x[0])
for tipo, grupo in itertools.groupby(dados, key=lambda x: x[0]):
    print(f"{tipo}: {[item[1] for item in grupo]}")

# product — produto cartesiano
cores = ["vermelho", "azul"]
tamanhos = ["P", "M", "G"]
combinacoes = list(itertools.product(cores, tamanhos))

6. Strings e Formatação

# f-strings — a forma preferida (Python 3.6+)
nome = "Maria"
idade = 28
print(f"Nome: {nome}, Idade: {idade}")
print(f"Ano de nascimento: {2026 - idade}")
print(f"PI: {3.14159:.2f}")         # PI: 3.14
print(f"{'centro':^20}")            # centralizado em 20 chars
print(f"{1000000:,.2f}")            # 1,000,000.00
print(f"{'python':>10}")            # alinhado à direita

# f-strings com expressões (Python 3.12+ — debug)
x = 42
print(f"{x = }")  # x = 42

# .format() — ainda útil para templates
template = "Olá, {nome}! Você tem {msgs} mensagens."
print(template.format(nome="Carlos", msgs=5))

# Métodos de string úteis
texto = "  Python é incrível  "
print(texto.strip())             # "Python é incrível"
print(texto.lower())             # "  python é incrível  "
print("python".capitalize())    # "Python"
print("um-dois-três".split("-"))  # ['um', 'dois', 'três']
print(", ".join(["a", "b", "c"]))  # "a, b, c"
print("Python" in texto)          # True
print(texto.replace("incrível", "fantástico"))

# Raw strings e multiline
caminho = r"C:\Users\maria\documentos"  # sem escapar \
sql = """
    SELECT nome, idade
    FROM usuarios
    WHERE ativo = true
    ORDER BY nome
"""

# Regex básico com re
import re

texto = "Meu CEP é 01310-100 e o outro é 04538-133"
ceps = re.findall(r"\d{5}-\d{3}", texto)
print(ceps)  # ['01310-100', '04538-133']

# Substituição com regex
limpo = re.sub(r"[^\w\s]", "", "Olá, mundo! Python #1")
print(limpo)  # "Olá mundo Python 1"

# Compilar regex para reutilização
padrao_email = re.compile(r"[\w.+-]+@[\w-]+\.[\w.]+")
emails = padrao_email.findall("contato: ana@teste.com, suporte@empresa.com.br")

7. Tratamento de Erros

# try / except / else / finally
def dividir(a: float, b: float) -> float:
    try:
        resultado = a / b
    except ZeroDivisionError:
        print("Erro: divisão por zero!")
        return 0.0
    except TypeError as e:
        print(f"Erro de tipo: {e}")
        return 0.0
    else:
        print("Divisão realizada com sucesso")
        return resultado
    finally:
        print("Operação de divisão finalizada")

# Capturar múltiplas exceções
try:
    valor = int("abc")
except (ValueError, TypeError) as e:
    print(f"Erro de conversão: {e}")

# Exceções customizadas
class SaldoInsuficienteError(Exception):
    def __init__(self, saldo: float, valor: float):
        self.saldo = saldo
        self.valor = valor
        super().__init__(
            f"Saldo R${saldo:.2f} insuficiente para saque de R${valor:.2f}"
        )

def sacar(saldo: float, valor: float) -> float:
    if valor > saldo:
        raise SaldoInsuficienteError(saldo, valor)
    return saldo - valor

# Context manager com with
with open("arquivo.txt", "w", encoding="utf-8") as f:
    f.write("Olá, Python!")

# Context manager customizado
from contextlib import contextmanager

@contextmanager
def timer(descricao: str):
    import time
    inicio = time.perf_counter()
    try:
        yield
    finally:
        duracao = time.perf_counter() - inicio
        print(f"{descricao}: {duracao:.4f}s")

with timer("processamento"):
    sum(range(1_000_000))

# re-raise com contexto
try:
    resultado = int("abc")
except ValueError as e:
    raise RuntimeError("Falha ao processar entrada") from e

8. Classes e OOP

# Classe com type hints, property, e dunder methods
class ContaBancaria:
    def __init__(self, titular: str, saldo: float = 0.0) -> None:
        self.titular = titular
        self._saldo = saldo
        self._historico: list[str] = []

    @property
    def saldo(self) -> float:
        return self._saldo

    @saldo.setter
    def saldo(self, valor: float) -> None:
        if valor < 0:
            raise ValueError("Saldo não pode ser negativo")
        self._saldo = valor

    def depositar(self, valor: float) -> None:
        self._saldo += valor
        self._historico.append(f"+R${valor:.2f}")

    def __repr__(self) -> str:
        return f"ContaBancaria(titular='{self.titular}', saldo={self._saldo:.2f})"

    def __len__(self) -> int:
        return len(self._historico)

    def __eq__(self, other: object) -> bool:
        if not isinstance(other, ContaBancaria):
            return NotImplemented
        return self.titular == other.titular

# @staticmethod e @classmethod
class Validador:
    formatos_aceitos = [".csv", ".json", ".parquet"]

    @staticmethod
    def validar_email(email: str) -> bool:
        return "@" in email and "." in email.split("@")[-1]

    @classmethod
    def de_config(cls, config: dict) -> "Validador":
        instancia = cls()
        instancia.formatos_aceitos = config.get("formatos", cls.formatos_aceitos)
        return instancia

# Herança
class ContaPoupanca(ContaBancaria):
    def __init__(self, titular: str, saldo: float = 0.0, taxa: float = 0.005):
        super().__init__(titular, saldo)
        self.taxa = taxa

    def render_juros(self) -> None:
        juros = self._saldo * self.taxa
        self.depositar(juros)

# Protocol — tipagem estrutural (duck typing com type hints)
from typing import Protocol

class Enviavel(Protocol):
    def enviar(self, destino: str) -> bool: ...

class Email:
    def enviar(self, destino: str) -> bool:
        print(f"Enviando email para {destino}")
        return True

class SMS:
    def enviar(self, destino: str) -> bool:
        print(f"Enviando SMS para {destino}")
        return True

def notificar(mensageiro: Enviavel, destino: str) -> bool:
    return mensageiro.enviar(destino)

# Funciona com qualquer classe que tenha o método enviar()
notificar(Email(), "ana@teste.com")
notificar(SMS(), "+5511999999999")

9. Async/Await

Programação assíncrona permite alta concorrência em operações de I/O. Veja mais no nosso glossário de async/await e no post completo sobre Python async/await na prática.

import asyncio

# Função assíncrona básica
async def buscar_dados(url: str) -> str:
    print(f"Buscando {url}...")
    await asyncio.sleep(1)  # simula I/O
    return f"Dados de {url}"

# Executar uma coroutine
async def main():
    resultado = await buscar_dados("https://api.exemplo.com")
    print(resultado)

asyncio.run(main())

# Executar tarefas em paralelo com gather
async def buscar_tudo():
    urls = [
        "https://api.exemplo.com/users",
        "https://api.exemplo.com/posts",
        "https://api.exemplo.com/comments",
    ]
    resultados = await asyncio.gather(
        *(buscar_dados(url) for url in urls)
    )
    for r in resultados:
        print(r)

asyncio.run(buscar_tudo())

# create_task para controle mais granular
async def pipeline():
    task1 = asyncio.create_task(buscar_dados("https://api.exemplo.com/a"))
    task2 = asyncio.create_task(buscar_dados("https://api.exemplo.com/b"))

    # Podemos fazer outras coisas enquanto as tasks rodam
    print("Tasks criadas, aguardando...")

    dado1 = await task1
    dado2 = await task2
    return dado1, dado2

# Exemplo com aiohttp (instale: pip install aiohttp)
import aiohttp

async def buscar_api(session: aiohttp.ClientSession, url: str) -> dict:
    async with session.get(url) as response:
        return await response.json()

async def main_http():
    async with aiohttp.ClientSession() as session:
        urls = [
            "https://jsonplaceholder.typicode.com/posts/1",
            "https://jsonplaceholder.typicode.com/posts/2",
        ]
        tasks = [buscar_api(session, url) for url in urls]
        resultados = await asyncio.gather(*tasks)
        for post in resultados:
            print(f"Título: {post['title']}")

asyncio.run(main_http())

10. Módulos e Pacotes

Para gerenciamento moderno de pacotes, confira nosso post sobre o uv — o gerenciador de pacotes ultrarrápido. Para ambientes virtuais, veja o glossário sobre virtualenv.

# Importações
import os
import json
from pathlib import Path
from datetime import datetime, timedelta
from typing import Any

# Importações relativas (dentro de um pacote)
# meu_pacote/
# ├── __init__.py
# ├── utils.py
# └── modelos/
#     ├── __init__.py
#     └── usuario.py

# Em usuario.py:
from ..utils import formatar_nome   # sobe um nível
from . import validacoes             # mesmo nível

# pyproject.toml moderno (substitui setup.py)
# [project]
# name = "meu-pacote"
# version = "1.0.0"
# requires-python = ">=3.11"
# dependencies = [
#     "httpx>=0.27",
#     "pydantic>=2.0",
# ]
#
# [project.optional-dependencies]
# dev = ["pytest", "ruff", "mypy"]
#
# [tool.ruff]
# line-length = 88

# Criando ambiente virtual e instalando dependências
# python -m venv .venv
# source .venv/bin/activate  (Linux/Mac)
# .venv\Scripts\activate     (Windows)
# pip install -r requirements.txt

# Com uv (muito mais rápido):
# uv venv
# uv pip install httpx pydantic

11. Comandos Úteis

Referência rápida dos comandos que todo desenvolvedor Python usa. Para mais sobre o Ruff, leia nosso post sobre Ruff: linter e formatador.

# Estes são comandos de terminal, não Python:

# Ambiente virtual
# python -m venv .venv
# source .venv/bin/activate

# Gerenciamento de pacotes
# pip install pacote
# pip install -r requirements.txt
# pip freeze > requirements.txt
# pip list --outdated

# Com uv (alternativa moderna e rápida)
# uv venv
# uv pip install pacote
# uv pip compile requirements.in -o requirements.txt
# uv run python script.py

# Testes com pytest
# pytest                          # roda todos os testes
# pytest tests/test_api.py        # arquivo específico
# pytest -k "test_login"          # filtrar por nome
# pytest -x                       # para no primeiro erro
# pytest --cov=src                # com cobertura

# Linting e formatação com Ruff
# ruff check .                    # verificar erros
# ruff check --fix .              # corrigir automaticamente
# ruff format .                   # formatar código

# Type checking com mypy
# mypy src/                       # verificar tipos
# mypy --strict src/              # modo estrito

# Executar módulos como script
# python -m http.server 8000      # servidor HTTP simples
# python -m json.tool data.json   # formatar JSON
# python -m timeit "sum(range(100))"  # benchmark rápido

12. Dicas e Truques

# Unpacking avançado
primeiro, *meio, ultimo = [1, 2, 3, 4, 5]
# primeiro=1, meio=[2, 3, 4], ultimo=5

# enumerate com start
for i, item in enumerate(["a", "b", "c"], start=1):
    print(f"{i}: {item}")

# zip para iterar em paralelo
nomes = ["Ana", "Bruno", "Clara"]
idades = [25, 30, 28]
cidades = ["SP", "RJ", "BH"]
for nome, idade, cidade in zip(nomes, idades, cidades):
    print(f"{nome}, {idade} anos, mora em {cidade}")

# zip com strict (Python 3.10+) — erro se tamanhos diferentes
# for a, b in zip(lista1, lista2, strict=True):

# any() e all()
numeros = [2, 4, 6, 8, 10]
print(all(n % 2 == 0 for n in numeros))  # True — todos pares
print(any(n > 9 for n in numeros))        # True — pelo menos um > 9

# Merge de dicionários com | (Python 3.9+)
config_padrao = {"timeout": 30, "retries": 3, "debug": False}
config_usuario = {"timeout": 60, "debug": True}
config_final = config_padrao | config_usuario
# {'timeout': 60, 'retries': 3, 'debug': True}

# |= para atualizar in-place
config_padrao |= {"nova_opcao": "valor"}

# pathlib — manipulação moderna de caminhos
from pathlib import Path

projeto = Path("/home/usuario/projeto")
config = projeto / "config" / "settings.json"
print(config.exists())
print(config.suffix)       # .json
print(config.stem)         # settings
print(config.parent)       # /home/usuario/projeto/config

# Listar arquivos Python recursivamente
for py_file in projeto.rglob("*.py"):
    print(py_file.name)

# Ler e escrever com pathlib
conteudo = Path("dados.txt").read_text(encoding="utf-8")
Path("saida.txt").write_text("resultado", encoding="utf-8")

# Type guards (Python 3.10+)
from typing import TypeGuard

def is_lista_strings(val: list[object]) -> TypeGuard[list[str]]:
    return all(isinstance(item, str) for item in val)

dados: list[object] = ["a", "b", "c"]
if is_lista_strings(dados):
    # Aqui o mypy sabe que dados é list[str]
    print(dados[0].upper())

# Walrus operator em loops de leitura
# while (linha := input(">>> ")) != "sair":
#     print(f"Você digitou: {linha}")

# Desempenho: usar __slots__ em classes
class PontoRapido:
    __slots__ = ("x", "y")
    def __init__(self, x: float, y: float):
        self.x = x
        self.y = y
# Usa menos memória e é mais rápido que classe normal

Explore outros ecossistemas: Se você busca uma linguagem compilada de alta performance para sistemas e APIs, conheça o Go (Golang) — excelente para microsserviços e ferramentas CLI. Para código de performance crítica onde cada milissegundo conta, explore o Rust — ideal para sistemas de baixo nível e WebAssembly. E se seu foco é desenvolvimento Android ou aplicações na JVM, veja o Kotlin — a linguagem moderna do ecossistema Java.

0 resultados

Nenhum conteudo encontrado nesta secao.