Fluxo de Controle
Python expressa ramificação com if/elif/else, correspondência estrutural com match/case e iteração com for e while. Cláusulas else de loop e operadores booleanos de short-circuit são idiomatismos que valem a pena aprender cedo.
Receita
for index, item in enumerate(["a", "b", "c"], start=1):
if item == "b":
continue
print(index, item)
match status:
case 200:
print("ok")
case 404 | 410:
print("ausente")
case code if 500 <= code < 600:
print("erro no servidor")Quando usar isso:
- Ramificação em enums, códigos HTTP ou tipos de comando
- Desestruturação de dados JSON aninhados com
match - Varredura de sequências com saída antecipada (
break) - Combinação de múltiplos iteráveis com
zip
Exemplo de Trabalho
from dataclasses import dataclass
@dataclass
class Event:
kind: str
payload: dict[str, object]
def handle(event: Event) -> str:
match event:
case Event(kind="user.created",
O que isso demonstra:
matchvincula variáveis (uid,email) enquanto corresponde à estrutura do dicionário- Padrões de classe combinam restrições de tipo e atributo
for/elseretorna um sentinela quando nenhumbreaké atingidocontinuepula para a próxima iteração sem sair do loop
Mergulho Profundo
Como Funciona
- Veracidade impulsiona
if- Objetos implementam__bool__ou__len__. - Correspondência de padrões - Introduzido em 3.10; os casos são verificados de cima para baixo; a primeira correspondência vence.
- Short-circuit -
a and bavaliabapenas seafor verdadeiro;a or bpulabseafor verdadeiro. - Protocolo de iteração -
forchamaiter()e depoisnext()repetidamente atéStopIteration. - while else - Mesmas semânticas de
for else- executa quando o loop termina sembreak.
Recursos do match em Resumo
| Padrão | Exemplo | Corresponde |
|---|---|---|
| Literal | case 404: | Valor exato |
| OU | case 401 | 403: | Qualquer um dos valores |
| Guarda | case int(n) if n > 0: | Padrão + condição |
| Sequência | case [x, y, *rest]: | Comprimento e forma da lista/tupla |
| Mapeamento | case {"id": int(i)}: | Chaves e tipos do dicionário |
Notas Python
# walrus := atribui dentro de expressões (3.8+)
if (line := input()) == "quit":
pass
# zip strict=True (3.10+) levanta erro em comprimentos desiguais
for a, b in zip(xs, ys, strict=True):
...Armadilhas
- Falta de
breakemwhile True- Loops infinitos travam workers. Correção: Condição debreakexplícita ou timeout. matchsem fall-through - Não há fall-through automático entre casos (diferente doswitchem C). Correção: Combinar com|ou lógica compartilhada.- Confusão no
loop else-elseexecuta quando não hábreak, não em condição falsa. Correção: Comentar a intenção ou refatorar para funções. - Modificar lista durante iteração - Pula elementos ou levanta erros. Correção: Iterar uma cópia ou construir uma nova lista.
- Contêineres vazios verdadeiros -
[0]é verdadeiro porque não está vazio. Correção: Comparar comprimentos ou valores explicitamente quando necessário.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Cadeia if/elif | Comparações escalares simples | Formas JSON aninhadas profundamente |
match/case | Desestruturação estrutural | Apenas ramificação booleana de dois caminhos |
| Despacho de Dicionário | Muitos chamáveis indexados por string | Necessidade de desestruturação |
filter/map | Transformações funcionais | Efeitos colaterais por item |
FAQs
Quando devo usar match em vez de if?
Ao ramificar com base na estrutura - chaves de dicionário tipadas, aridade de tupla ou atributos de classe. Use if para booleanos simples.
O que significa for-else?
O bloco else é executado após o loop ser concluído sem atingir break. Útil para loops de busca.
Como sair de loops aninhados?
Use uma flag, extraia para uma função com return, ou em padrões de exceção estruturados do 3.11+ com moderação.
Match usa == ou isinstance?
Padrões de classe usam semântica de isinstance; literais usam igualdade. Padrões de sequência correspondem à estrutura e ao comprimento.
O que é avaliação short-circuit?
and/or param de avaliar assim que o resultado é determinado - use para cláusulas de guarda como obj and obj.method().
Como iterar com um índice?
enumerate(items, start=0) - mais limpo do que variáveis de contador manuais.
Posso usar match em classes personalizadas?
Sim - case MyClass(attr=value): corresponde a instâncias com atributos. Dataclasses funcionam bem aqui.
Qual a diferença entre continue e pass?
continue pula para a próxima iteração. pass é um placeholder sem operação em blocos que exigem sintaxe.
Como lidar com valores opcionais em match?
Inclua case None: ou use guardas. Combine com dicas de tipo e estreitamento em verificadores estáticos.
while else é comum?
Raro em código de aplicação. for/else para busca é mais idiomático; prefira funções a loop else inteligentes.
Relacionados
- Compreensões e Expressões Geradoras - iteração sem loop
- Funções, Args e Escopo - retorno antecipado em vez de aninhamento profundo
- Enums - match em membros de enum
- Métodos Dunder / Mágicos - personalização da veracidade
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.