Lambda e Closures

Em Python, lambdas e closures são técnicas avançadas para criar funções de maneira concisa e poderosa. As lambdas são funções anônimas e de uma única expressão, enquanto as closures são funções definidas dentro de outras funções que podem capturar variáveis do escopo pai. Neste tutorial, vamos explorar esses conceitos em detalhes, entender como eles funcionam e aprender como utilizá-los para simplificar e aprimorar suas funções em Python.

1. Lambdas em Python: Funções Anônimas Simples

Lambdas são funções anônimas de uma única expressão. Elas são úteis para operações simples e podem ser usadas onde funções mais complexas são esperadas. A sintaxe básica de uma lambda é:

lambda argumentos: expressao

Exemplo 1: Lambda para Somar Dois Números

soma = lambda x, y: x + y
print(soma(3, 5))  # Saída: 8

Neste exemplo, lambda é usado para criar uma função que soma dois números.

Exemplo 2: Usando Lambda com map()

numeros = [1, 2, 3, 4, 5]
quadrados = list(map(lambda x: x ** 2, numeros))
print(quadrados)  # Saída: [1, 4, 9, 16, 25]

Neste exemplo, lambda é usado com map() para calcular os quadrados dos números.

2. Closures em Python: Funções Dentro de Funções

Closures são funções definidas dentro de outras funções. Elas podem capturar variáveis do escopo pai e são úteis para criar funções que podem manter o estado entre chamadas.

Exemplo 3: Closure para Contador

def contador():
    count = 0
    
    def incrementar():
        nonlocal count
        count += 1
        return count
    
    return incrementar

contador_funcao = contador()
print(contador_funcao())  # Saída: 1
print(contador_funcao())  # Saída: 2

Neste exemplo, a função contador() retorna uma closure incrementar() que mantém o estado da variável count entre chamadas.

Lambdas e closures são técnicas poderosas em Python para criar funções de forma concisa e flexível. As lambdas são úteis para operações simples e são frequentemente usadas com map(), filter(), e reduce(). As closures são úteis para criar funções que podem manter o estado entre chamadas e são especialmente úteis em situações onde você precisa encapsular comportamentos específicos em funções.