Métodos Funcionais com Listas
O que são métodos funcionais?
Essas funções processam listas sem modificar os dados originais. Os dados entram, são transformados ou filtrados, e saem como dados novos. A lista original fica intacta.
As três principais são: filter() seleciona elementos, map() transforma elementos e sorted() ordena elementos.
filter -- seleciona quem passa no teste
O filter() recebe uma função é uma lista. Só passam os itens que retornam True:
números: list[int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pares: list[int] = list(filter(lambda x: x % 2 == 0, números))
print(pares) # → [2, 4, 6, 8, 10]
print(números) # → [1, 2, 3, ...] (original intacta!)
notas: list[float] = [8.5, 4.0, 7.0, 3.5, 9.2, 6.0]
aprovados: list[float] = list(filter(lambda n: n >= 7.0, notas))
print(aprovados) # → [8.5, 7.0, 9.2]
map -- transforma cada elemento
O map() aplica uma função em cada item e retorna os resultados:
números: list[int] = [1, 2, 3, 4, 5]
dobros: list[int] = list(map(lambda x: x * 2, números))
print(dobros) # → [2, 4, 6, 8, 10]
nomes: list[str] = ["ana", "bruno", "carla"]
maiusculos: list[str] = list(map(lambda n: n.upper(), nomes))
print(maiusculos) # → ["ANA", "BRUNO", "CARLA"]
Combinando filter + map
Primeiro filtra, depois transforma:
números: list[int] = [1, 2, 3, 4, 5]
resultado: list[int] = list(map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, números)))
print(resultado) # → [4, 16]
sorted -- ordena sem alterar o original
sorted() cria uma lista nova, ordenada:
notas: list[float] = [8.5, 4.0, 7.0, 3.5, 9.2]
crescente: list[float] = sorted(notas)
print(crescente) # → [3.5, 4.0, 7.0, 8.5, 9.2]
print(notas) # → [8.5, 4.0, 7.0, 3.5, 9.2] (original intacta!)
decrescente: list[float] = sorted(notas, reverse=True)
print(decrescente) # → [9.2, 8.5, 7.0, 4.0, 3.5]
Com key você define o critério de ordenação:
nomes: list[str] = ["Carlos", "ana", "Bruno"]
por_nome: list[str] = sorted(nomes, key=lambda n: n.lower())
print(por_nome) # → ["ana", "Bruno", "Carlos"]
sort vs sorted
números: list[int] = [5, 2, 8, 1, 9]
números.sort() # MUDA a lista original
print(números) # → [1, 2, 5, 8, 9]
sum, max, min -- funções built-in
Calculos rapidos sem precisar de loop:
notas: list[float] = [8.5, 7.0, 9.2, 6.8, 7.5]
print(sum(notas)) # → 39.0
print(max(notas)) # → 9.2
print(min(notas)) # → 6.8
média: float = sum(notas) / len(notas)
print(f"Media: {média:.1f}") # → Media: 7.8
Exercício prático
Dada uma lista de produtos com nome é preco:
- Filtre os produtos com preco acima de 50
- Crie uma lista só com os nomes (use map)
- Ordene por preco crescente
produtos: list[tuple[str, float]] = [
("Teclado", 120.0),
("Mouse", 45.0),
("Monitor", 890.0),
("Cabo USB", 15.0),
("Headset", 200.0),
]
# 1. list(filter(lambda p: p[1] > 50, produtos))
# 2. list(map(lambda p: p[0], produtos))
# 3. sorted(produtos, key=lambda p: p[1])
Referências
- Funções built-in -- documentação oficial (filter, map, sorted, sum, max, min)
- Python's filter(): Extract Values From Iterables -- guia completo no Real Python
- Curso Python #16 - Funções (Parte 1) -- Curso em Video
Testa o que você leu
4 perguntas sobre esta aula. Errar aqui não custa nada - a explicação vem junto da correção.