Módulo 4 - Funções como objetos
Closures
11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Definir closure como a função interna que lembra o ambiente externo.
- Escrever uma função que devolve outra função que usa um valor de fora.
- Construir uma fábrica de funções que gera versões sob medida.
- Reconhecer que cada chamada da fábrica gera um closure independente.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Closures.
Os objetivos desta aula. Definir closure como a função interna que lembra o ambiente externo. Escrever uma função que devolve outra função que usa um valor de fora. Construir uma fábrica de funções que gera versões sob medida. Reconhecer que cada chamada da fábrica gera um closure independente.
Veja o essencial, parte por parte.
A função que lembra. Closure é a função interna que lembra as variáveis da função externa.
Fábricas de funções independentes. Decoradores, um tema mais à frente, são construídos com closures.
Fixando: a função que fecha ao redor. Criar closures dentro de um for que usa a variável do laço pode surpreender: todas podem lembrar o último valor.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
A função que lembra
Na aula 2 você viu uma função devolver outra função. Agora vamos olhar o que torna esse padrão poderoso de verdade. Quando a função interna usa uma variável que veio da função externa, acontece algo curioso: mesmo depois de a função externa terminar e sair da memória, a função interna continua lembrando daquele valor. Essa combinação de uma função interna com o ambiente que ela guardou tem um nome: closure. A palavra vem da ideia de que a função interna fecha ao redor das variáveis que usou.
Parece mágica, mas é uma regra clara. Quando o Python cria a função interna, ele anota de quais variáveis externas ela precisa e mantém essas variáveis vivas enquanto a função interna existir. Repare no exemplo: criar_multiplicador termina e devolve a função de dentro, mas o valor de fator não se perde. A função devolvida ainda o conhece. É por isso que dobro sabe multiplicar por 2 e triplo sabe multiplicar por 3, cada um com o seu próprio fator lembrado.
def criar_multiplicador(fator):
def multiplicar(numero):
return numero * fator # usa "fator" da funcao externa
return multiplicar
dobro = criar_multiplicador(2)
triplo = criar_multiplicador(3)
print(dobro(10)) # 20 (lembra fator = 2)
print(triplo(10)) # 30 (lembra fator = 3)
print(dobro(7)) # 14Cada função devolvida guarda o seu próprio fator: isso é um closure.
Fábricas de funções independentes
Uma função como criar_multiplicador é uma fábrica de funções. Você a chama com um argumento e recebe uma função nova, ajustada para aquele argumento. Cada chamada produz um closure independente, com o seu próprio valor guardado. dobro e triplo não compartilham nada: são duas funções distintas, cada uma com o seu fator preso. Isso permite gerar variações sob medida sem repetir código. Em vez de escrever uma função para dobrar, outra para triplicar e outra para multiplicar por dez, você escreve a fábrica uma vez e pede as versões que precisar.
def criar_saudacao(saudacao):
def cumprimentar(nome):
return f"{saudacao}, {nome}!"
return cumprimentar
# Uma fabrica, varias funcoes independentes
bom_dia = criar_saudacao("Bom dia")
boa_noite = criar_saudacao("Boa noite")
print(bom_dia("Ana")) # Bom dia, Ana!
print(boa_noite("Bruno")) # Boa noite, Bruno!
# Prova de independencia: cada uma lembra a sua saudacao
funcoes = [criar_saudacao(s) for s in ["Oi", "Alô"]]
print(funcoes[0]("Carla")) # Oi, Carla!
print(funcoes[1]("Davi")) # Alô, Davi!Cada função criada pela fábrica lembra a sua própria saudação, sem interferência.
Fixando: a função que fecha ao redor
Feche a aula com a imagem que dá nome ao conceito: a função interna fecha ao redor das variáveis que usou, levando-as consigo para onde for chamada. Isso permite escrever fábricas de funções, gerando versões especializadas a partir de um único molde, cada uma com o seu valor lembrado. Você não precisa dominar todos os usos agora. O importante é reconhecer o padrão, porque ele volta com força no módulo de decoradores, onde os closures deixam de ser curiosidade e viram ferramenta do dia a dia.
Teste rápido
O que é um closure no Python?
Perguntas frequentes
- Por que a função interna lembra o valor se a externa já terminou?
- Porque o Python percebe que a função interna precisa daquela variável e a mantém viva enquanto a função interna existir. A variável não é descartada junto com a função externa; ela fica presa ao closure e viaja com ele.
- Cada chamada da fábrica cria um closure separado?
- Sim. criar_multiplicador(2) e criar_multiplicador(3) devolvem duas funções distintas, cada uma com o seu próprio fator lembrado. Elas não compartilham estado, então mexer numa não afeta a outra. Essa independência é o que torna a fábrica útil.
- Qual a diferença entre closure e função de ordem superior?
- Função de ordem superior é a que recebe ou devolve funções. Closure é o resultado específico de uma função interna que lembra variáveis da externa. Toda fábrica de funções que devolve um closure é de ordem superior, mas nem toda função de ordem superior gera closure.
- Closures substituem variáveis globais?
- Em muitos casos, sim, e com vantagem. Guardar configuração num closure evita variáveis globais que qualquer parte do programa poderia alterar. O valor fica preso à função que o usa, mais seguro e mais fácil de raciocinar.
- Preciso de closures para o resto do curso?
- Você não precisa dominá-los agora, mas precisa reconhecer o padrão. O módulo de decoradores, mais adiante, é construído sobre closures. Entender aqui que uma função interna lembra o ambiente externo vai deixar aquele tema muito mais simples.
- O que é a pegadinha de criar closures num laço?
- Se você cria funções dentro de um for e elas usam a variável do laço, todas podem acabar lembrando o último valor dela, porque compartilham a mesma variável. A saída é passar o valor como argumento com padrão (fator=fator) ou usar uma fábrica, chamada a cada volta, como no exemplo da aula.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.