List comprehensions: um for compactado numa linha
Construir uma lista nova a partir de outra, item por item, sempre segue o mesmo padrão de três ou quatro linhas. Python tem uma forma de escrever esse padrão inteiro numa linha só.
Estudar esta lição interativa →No Módulo 4, você escreveu um for que percorria uma lista de números e guardava só os pares numa lista nova, com .append(). Esse padrão, "para cada item de uma lista, talvez transformado, talvez filtrado, guarde numa lista nova", é tão comum em Python que existe uma forma compacta de escrevê-lo numa única linha: a list comprehension.
numeros = [1, 2, 3, 4, 5]
pares_for = []
for numero in numeros:
if numero % 2 == 0:
pares_for.append(numero)
pares_comp = [numero for numero in numeros if numero % 2 == 0]
print(pares_for)
print(pares_comp)As duas formas produzem exatamente o mesmo resultado.
A estrutura é [expressao for item in lista if condição], lida quase como uma frase em português: "pegue numero para cada numero em numeros, se numero for par". A parte if condição é opcional; sem ela, todos os itens (já transformados pela expressão) entram na lista nova.
Pense numa comprehension como uma receita compacta de bolo escrita numa única frase: "misture farinha com açúcar para cada xícara de leite adicionada, se o leite estiver morno" versus o mesmo processo descrito passo a passo, em quatro linhas separadas. As duas descrevem exatamente a mesma receita; a comprehension só é mais direta para quem já conhece o formato.
Quando você precisa do índice de cada item além do próprio valor (por exemplo, para numerar itens numa lista exibida ao usuário), enumerate(lista) resolve isso sem precisar controlar um contador manual:
tarefas = ["estudar Python", "fazer exercícios", "revisar anotações"]
for indice, tarefa in enumerate(tarefas):
print(f"{indice}: {tarefa}")enumerate entrega (índice, valor) prontos para desempacotar, começando em 0.
enumerate(lista, start=1) começa a contagem em 1 em vez de 0, útil para exibir uma numeração "humana" (1, 2, 3...) em vez da numeração de índice interna do Python.
Uma comprehension aninhada, com múltiplos for e if espremidos numa linha só, não gera erro nenhum, mas é um convite a bugs difíceis de encontrar, porque ninguém consegue ler aquilo de relance. A regra prática: se a comprehension precisa de mais de uma condição, ou de mais de uma transformação, considere voltar para um for tradicional, mais longo, mas muito mais fácil de revisar depois.
numeros = [1, 2, 3, 4, 5]
quadrados = []
for numero in numeros:
quadrados.append(numero ** 2)
print(quadrados)Substitua o for por uma comprehension equivalente.