Python ‐ Functional Programming 2 - cunhapaulo/ReferenceCard GitHub Wiki

1. Funções de Alta Ordem (Higher-Order Functions)

Funções que recebem outras funções como argumento ou retornam funções.

Exemplo Avançado:

Vamos criar um sistema de aplicação de impostos, onde diferentes funções de imposto podem ser passadas dinamicamente.

def imposto_simples(valor):
    return valor * 0.1

def imposto_progresso(valor):
    return valor * 0.2 if valor > 5000 else valor * 0.1

def aplicar_imposto(funcao_imposto, valor):
    return funcao_imposto(valor)

# Testando diferentes impostos
valor_compra = 6000
print(aplicar_imposto(imposto_simples, valor_compra))   # Saída: 600.0
print(aplicar_imposto(imposto_progresso, valor_compra)) # Saída: 1200.0

2. Funções Anônimas (Lambda)

Funções curtas e sem nome, úteis para operações rápidas.

Exemplo Avançado:

Vamos criar um ordenador de lista de dicionários, onde ordenamos uma lista de produtos pelo preço.

produtos = [
    {"nome": "Celular", "preco": 1500},
    {"nome": "Notebook", "preco": 4500},
    {"nome": "Tablet", "preco": 2500}
]

# Ordenando pelo preço
produtos_ordenados = sorted(produtos, key=lambda p: p["preco"])
print(produtos_ordenados)

3. Mapeamento de Funções (map)

Aplica uma função a todos os elementos de um iterável.

Exemplo Avançado:

Vamos calcular o desconto para uma lista de produtos.

produtos = [
    {"nome": "Celular", "preco": 1500},
    {"nome": "Notebook", "preco": 4500},
    {"nome": "Tablet", "preco": 2500}
]

desconto = lambda p: {"nome": p["nome"], "preco": p["preco"] * 0.9}

produtos_com_desconto = list(map(desconto, produtos))
print(produtos_com_desconto)

4. Filtragem de Dados (filter)

Filtra elementos de um iterável com base em uma condição.

Exemplo Avançado:

Vamos filtrar os produtos mais caros que R$ 2000.

produtos = [
    {"nome": "Celular", "preco": 1500},
    {"nome": "Notebook", "preco": 4500},
    {"nome": "Tablet", "preco": 2500}
]

produtos_caros = list(filter(lambda p: p["preco"] > 2000, produtos))
print(produtos_caros)

5. Redução de Valores (reduce)

Reduz um iterável a um único valor aplicando uma função cumulativa.

Exemplo Avançado:

Vamos calcular o total de preços dos produtos.

from functools import reduce

produtos = [
    {"nome": "Celular", "preco": 1500},
    {"nome": "Notebook", "preco": 4500},
    {"nome": "Tablet", "preco": 2500}
]

total = reduce(lambda acc, p: acc + p["preco"], produtos, 0)
print(total)  # Saída: 8500

6. Compreensão de Listas (List Comprehension)

Forma concisa de criar listas aplicando funções e filtros.

Exemplo Avançado:

Vamos normalizar nomes de produtos (converter para maiúsculas).

produtos = ["celular", "notebook", "tablet"]
produtos_normalizados = [produto.upper() for produto in produtos]
print(produtos_normalizados)

7. Imutabilidade com Tuplas

Manter os dados imutáveis é um princípio importante da programação funcional.

Exemplo Avançado:

Vamos simular um registro de transações bancárias usando tuplas para garantir a imutabilidade.

transacoes = (
    {"tipo": "depósito", "valor": 1000},
    {"tipo": "saque", "valor": 500},
    {"tipo": "depósito", "valor": 2000}
)

# Tentativa de modificar uma transação geraria um erro
# transacoes[0]["valor"] = 2000  # Isso geraria um erro, pois tuplas são imutáveis

8. Funções Recursivas

Funções que chamam a si mesmas, útil para resolver problemas indutivos.

Exemplo Avançado:

Vamos criar uma função recursiva para calcular a sequência de Fibonacci.

def fibonacci(n, memo={}):
    if n in memo:
        return memo[n]
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo)
        return memo[n]

print(fibonacci(10))  # Saída: 55

9. Funções Puras

Funções que sempre retornam o mesmo resultado para os mesmos inputs e não têm efeitos colaterais.

Exemplo Avançado:

Vamos criar uma função pura para calcular imposto de um produto.

def calcular_imposto(preco, taxa=0.1):
    return preco * (1 + taxa)

print(calcular_imposto(1000))  # Saída: 1100.0
print(calcular_imposto(1000, 0.2))  # Saída: 1200.0

Esses exemplos mais avançados mostram como a programação funcional pode ser aplicada a problemas do mundo real de maneira mais eficiente. 🚀