Funções de Ordem Superior

As funções de ordem superior são uma característica poderosa em Python, permitindo que as funções sejam tratadas como qualquer outra variável. Isso significa que você pode passar funções como argumentos para outras funções, retorná-las como valores de outras funções e até mesmo definir funções dentro de outras funções. Neste tutorial, vamos explorar as funções de ordem superior em Python, entender seus conceitos fundamentais e aprender como elas podem ser utilizadas para tornar seu código mais flexível, modular e elegante.

1. Funções Como Variáveis:

Em Python, as funções são cidadãos de primeira classe, o que significa que você pode tratá-las como qualquer outra variável. Isso permite que você atribua funções a variáveis, passe-as como argumentos para outras funções e retorne-as como valores de outras funções.

def quadrado(x):
    return x ** 2

# Atribuindo uma função a uma variável
funcao = quadrado

# Chamando a função através da variável
print(funcao(5))  # Saída: 25

2. Funções Como Argumentos:

Você pode passar funções como argumentos para outras funções. Isso é especialmente útil quando você deseja aplicar uma operação a uma coleção de dados.

def aplicar_funcao(funcao, lista):
    return [funcao(x) for x in lista]

numeros = [1, 2, 3, 4, 5]

# Usando a função aplicar_funcao para calcular os quadrados dos números
quadrados = aplicar_funcao(quadrado, numeros)
print(quadrados)  # Saída: [1, 4, 9, 16, 25]

3. Funções Como Resultados:

Funções de ordem superior também podem retornar outras funções. Isso é útil para criar funções personalizadas baseadas em certos critérios.

def criar_funcao_potencia(expoente):
    def potencia(x):
        return x ** expoente
    return potencia

quadrado = criar_funcao_potencia(2)
cubo = criar_funcao_potencia(3)

print(quadrado(2))  # Saída: 4
print(cubo(2))  # Saída: 8

4. Funções Anônimas (Lambda):

As funções lambda são funções anônimas e de ordem superior que podem ter qualquer número de argumentos, mas consistem em uma única expressão.

quadrado = lambda x: x ** 2
print(quadrado(3))  # Saída: 9

5. Funções de Ordem Superior com map(), filter(), e reduce():

Python também fornece funções integradas como map(), filter() e reduce() que aceitam funções como argumentos.

Usando map():

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

Usando filter():

numeros = [1, 2, 3, 4, 5]
pares = list(filter(lambda x: x % 2 == 0, numeros))
print(pares)  # Saída: [2, 4]

Usando reduce():

from functools import reduce
numeros = [1, 2, 3, 4, 5]
soma = reduce(lambda x, y: x + y, numeros)
print(soma)  # Saída: 15

As funções de ordem superior em Python oferecem flexibilidade e expressividade ao seu código. Ao entender como passar funções como argumentos, retorná-las como resultados e aplicá-las a coleções de dados usando funções integradas, você pode criar código mais modular, reutilizável e elegante.