Uma linha, uma ideia
Você já escreveu o padrão várias vezes: começa com uma lista vazia, passa por algo, talvez filtre, e faz append no resultado.
Uma list comprehension diz a mesma coisa numa linha:
Leia da esquerda para a direita: "uma nova lista que consiste de n * 2, para cada n em numbers". A estrutura é [expressao for item in iteravel].
Isso não é truque específico do Python — chama-se comprehension porque você está descrevendo o que vai na nova lista, declarativamente, em vez de escrever a mecânica de como construí-la.
Adicionando um filtro
Solte uma cláusula if depois da parte do laço para filtrar:
Leia o segundo como: "n * n para cada n em numbers, mas só se n é ímpar".
O laço equivalente:
Os dois estão bem. A comprehension é mais curta e, depois de ler algumas, de fato mais fácil de varrer porque a intenção está ali numa linha.
Mapeamento e filtro combinados
Você pode passar valores por uma função e filtrar ao mesmo tempo:
Para cada palavra maior que 3 letras, inclua sua versão em maiúsculas.
Laços aninhados numa comprehension
Dois fors produzem um par estilo produto cartesiano:
A ordem é a mesma de quando você aninha os laços: o primeiro for é o externo, o segundo o interno. Lê da esquerda para a direita como o laço indentado equivalente.
Dois níveis é mais ou menos o limite antes de um laço normal ler melhor. Se chegar em três, volte para laços.
Dict e set comprehensions
Mesma ideia, chaves diferentes:
Set comprehensions parecem idênticas a dict comprehensions num relance — a diferença é o chave: valor vs só uma expressão única. Chaves mais : = dict; chaves sem : = set.
Expressões geradoras
Uma quase gêmea de list comprehension, mas com parênteses em vez de colchetes — e crucialmente, não constrói uma lista:
Repare que passamos o gerador direto para sum() e any() — sem parênteses extras. Expressões geradoras são a ferramenta certa quando quem chama só precisa iterar uma vez. Economizam memória em relação a uma lista completa para coleções grandes.
Quando usar um laço normal
Comprehensions são sedutoras. Tecnicamente dá para enfiar muita coisa em uma. Você não deveria.
Recorra a um laço comum quando:
- A transformação tem mais de uma etapa. Se precisa de variáveis intermediárias, escreva por extenso.
- Tem tratamento de erro complexo ou ramificação.
- Qualquer leitor tem que pausar mais de uma vez para entender a linha.
A regra que aplico: se consigo ler a comprehension num único fôlego e entender o que faz, fica. Se tropeço, reescrevo como laço.
Algumas comprehensions parecem espertas mas doem:
Mesmo resultado. A versão com laço tem cinco linhas em vez de uma, mas "mais longa" não é o mesmo que "pior".
Alguns padrões que você vai reusar
Esses cinco padrões cobrem uma quantidade surpreendente do trabalho do dia a dia com dados.
Próxima
Você já viu os principais tipos de coleção e a comprehension que amarra tudo. Próximo capítulo: funções — empacotar comportamento em unidades nomeadas e reutilizáveis.
Perguntas frequentes
O que é uma list comprehension em Python?
Uma sintaxe compacta para construir uma nova lista a partir de um iterável existente. [x * 2 for x in numbers] cria uma nova lista com cada número dobrado. Você também pode filtrar: [x for x in numbers if x > 0].
Quando não devo usar uma list comprehension?
Quando prejudica a legibilidade. Se a expressão de dentro é complexa ou muito aninhada, um laço for normal com nomes de variável adequados é mais claro. Comprehensions são para transforms simples — mapeamento e filtragem. Qualquer coisa mais complexa é melhor num laço completo.
Qual a diferença entre uma list comprehension e uma expressão geradora?
Uma list comprehension constrói a lista inteira na memória. Uma expressão geradora (mesma sintaxe, mas com parênteses) produz um item de cada vez. Use um gerador quando você está alimentando os resultados para algo que itera uma vez — como sum(...) — para não materializar uma lista que vai jogar fora em seguida.