Módulo 4 - Funções como objetos

Funções de ordem superior

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Definir o que é uma função de ordem superior.
  • Escrever uma função que recebe outra função como argumento.
  • Escrever uma função que devolve outra função.
  • Reconhecer funções de ordem superior já presentes no Python.

O que é ordem superior

O nome intimida, mas a ideia é direta. Na aula anterior você viu que funções são valores. Se são valores, uma função pode receber outra função como argumento e pode devolver uma função como resultado. Toda função que faz uma dessas duas coisas é chamada de função de ordem superior. O termo apenas dá nome a um padrão que fica natural assim que você aceita que funções circulam como qualquer outro dado.

Por que isso é útil? Porque separa o que varia do que é fixo. Imagine que você precisa aplicar uma transformação a cada item de uma lista. A parte fixa é percorrer a lista e juntar os resultados. A parte que varia é qual transformação aplicar: dobrar, elevar ao quadrado, deixar em maiúsculas. Uma função de ordem superior recebe a transformação como argumento e cuida do resto. Você escreve o laço uma vez e reaproveita com qualquer operação, em vez de copiar o mesmo laço trocando só a linha do meio.

def aplicar_a_cada(funcao, lista):
    resultado = []
    for item in lista:
        resultado.append(funcao(item))
    return resultado

def quadrado(x):
    return x * x

numeros = [1, 2, 3, 4]
print(aplicar_a_cada(quadrado, numeros))  # [1, 4, 9, 16]
print(aplicar_a_cada(abs, [-5, 3, -2]))   # [5, 3, 2]  (abs e embutida)

aplicar_a_cada recebe uma função e a executa em cada item: o laço é escrito uma vez só.

Receber uma função, devolver uma função

Há dois lados na definição, e vale ver os dois. O primeiro, receber uma função, você acabou de ver: aplicar_a_cada aceita a transformação como argumento. Esse argumento costuma ser chamado de callback, porque quem escreveu a função de ordem superior decide o momento de chamá-lo de volta. O segundo lado é devolver uma função. Aqui uma função funciona como uma fábrica: você chama a fábrica com alguns parâmetros e recebe de volta uma nova função pronta, ajustada para aquilo que você pediu.

def criar_saudacao(saudacao):
    def cumprimentar(nome):
        return f"{saudacao}, {nome}!"
    return cumprimentar   # devolve a funcao interna

bom_dia = criar_saudacao("Bom dia")
ola = criar_saudacao("Olá")

print(bom_dia("Ana"))   # Bom dia, Ana!
print(ola("Bruno"))     # Olá, Bruno!

criar_saudacao devolve uma função sob medida. Esse padrão vira closure na aula 5.

Fixando: ordem superior

O ganho de escrever funções de ordem superior é sempre o mesmo: menos repetição e mais flexibilidade. Você escreve a estrutura repetitiva uma vez, o laço, a montagem do resultado, e deixa um espaço configurável, a função que entra. Quem chama decide o comportamento sem tocar na estrutura. É a mesma lógica que faz o sorted da próxima aula ordenar por qualquer critério: ele cuida da ordenação e você entrega a função que diz o que comparar. A partir daqui, o Python fica bem mais expressivo.

Teste rápido

O que caracteriza uma função de ordem superior?

Perguntas frequentes

Preciso decorar o termo função de ordem superior?
O termo ajuda a conversar com outras pessoas e a ler documentação, mas o que importa é a ideia: uma função que trabalha com outras funções. Se você entende que dá para receber e devolver funções, já sabe o essencial, mesmo sem lembrar o nome exato.
Qual a diferença entre callback e função de ordem superior?
São dois lados da mesma cena. A função de ordem superior é a que recebe outra função; o callback é a função que você passa para ela executar. Em sorted(lista, key=len), sorted é a de ordem superior e len é o callback.
Devolver uma função não é a mesma coisa que closure?
Está muito próximo. Toda vez que uma função interna que você devolve usa uma variável da função externa, você tem um closure. A aula 5 aprofunda esse caso. Por ora, basta ver que uma função pode fabricar e devolver outra função.
Isso deixa o código mais rápido?
O ganho principal não é velocidade, é organização e reaproveitamento. Você escreve a estrutura repetitiva uma vez e troca só o comportamento. Em alguns casos o código fica um pouco mais enxuto, mas o objetivo é clareza e flexibilidade, não desempenho.
Funções de ordem superior existem só no Python?
Não. Elas aparecem em muitas linguagens, principalmente nas que tratam funções como valores. O Python torna o uso simples porque toda função já é um objeto, sem sintaxe especial para passar uma função adiante.
Quando NÃO usar esse padrão?
Quando ele deixa o código mais difícil de ler para um ganho pequeno. Se um laço simples resolve com clareza, prefira o laço. Funções de ordem superior brilham quando você repetiria a mesma estrutura com comportamentos diferentes; para um caso único, muitas vezes o direto é melhor.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.