Pular para o conteúdo

Como usar o python reduce?

CodeMDD.io

Python’s reduce(): De Funcional para Estilo Pythonic

Explorando a Programação Funcional em Python

A programação funcional é um paradigma de programação baseado em decompor um problema em um conjunto de funções individuais. Idealmente, cada função recebe apenas um conjunto de argumentos de entrada e produz uma saída.

Na programação funcional, as funções não têm nenhum estado interno que afete a saída que elas produzem para uma determinada entrada. Isso significa que toda vez que você chama uma função com o mesmo conjunto de argumentos de entrada, você obtém o mesmo resultado ou saída.

Em um programa funcional, os dados de entrada fluem por um conjunto de funções. Cada função opera em sua entrada e produz alguma saída. A programação funcional tenta evitar tipos de dados mutáveis e mudanças de estado o máximo possível. Ela trabalha com os dados que fluem entre as funções.

Outras características principais da programação funcional incluem:

  • O uso de recursão em vez de loops ou outras estruturas como uma estrutura de controle primária
  • Um foco no processamento de listas ou arrays
  • Um foco no “o que” deve ser calculado em vez de “como” calculá-lo
  • O uso de funções puras

Introdução ao reduce() do Python

O reduce() do Python é uma função que implementa uma técnica matemática chamada fold ou redução. O reduce() é útil quando você precisa aplicar uma função a um iterável e reduzi-lo a um único valor cumulativo. O reduce() do Python é popular entre os desenvolvedores com formação em programação funcional, mas o Python tem mais a oferecer.

Neste tutorial, você aprenderá como o reduce() funciona e como usá-lo de forma eficaz. Você também aprenderá algumas ferramentas alternativas do Python que podem ser mais Pythonicas, legíveis e eficientes do que o reduce().

No final deste tutorial, você será capaz de decidir quais ferramentas usar para resolver problemas de redução em Python.

Como o reduce() do Python funciona

A função reduce() do Python recebe dois argumentos obrigatórios: uma função e um iterável. A função é aplicada a pares consecutivos de elementos do iterável até reduzi-lo a um único valor cumulativo.

O valor cumulativo é retornado como o resultado final da função reduce(). Vamos dar uma olhada em um exemplo para entender melhor:

from functools import reduce
def soma(x, y):
return x + y
valores = [1, 2, 3, 4, 5]
soma_total = reduce(soma, valores)
print(soma_total) # output: 15

Neste exemplo, temos uma função soma() que recebe dois argumentos x e y e retorna a soma deles. Em seguida, temos uma lista de valores [1, 2, 3, 4, 5]. Utilizamos a função reduce() para reduzir essa lista a um único valor cumulativo, chamando a função soma() para cada par consecutivo de elementos. O resultado é a soma total dos valores da lista, que é 15.

Argumentos Obrigatórios: função e iterável

Na chamada da função reduce(), você precisa fornecer uma função que será aplicada a pares consecutivos de elementos do iterável e um iterável que será reduzido a um único valor cumulativo.

A função precisa ter dois argumentos, que serão substituídos pelos pares consecutivos de elementos do iterável. A função é chamada repetidamente até que o iterável seja reduzido a um único valor cumulativo.

O iterável pode ser qualquer objeto que seja iterável em Python, como uma lista, uma tupla ou um objeto de um tipo que implemente o protocolo de iteração.

Um exemplo prático de redução de iteráveis com o reduce() do Python

Vamos explorar alguns casos de uso comuns para o reduce() do Python:

Somando valores numéricos

Suponha que você tenha uma lista de números e deseje obter a soma total desses números. Você pode usar o reduce() para fazer isso de forma concisa:

from functools import reduce
valores = [1, 2, 3, 4, 5]
soma_total = reduce(lambda x, y: x + y, valores)
print(soma_total) # output: 15

Neste exemplo, usamos o reduce() para aplicar uma função lambda que recebe dois argumentos x e y e retorna a soma deles. O reduce() é aplicado a pares consecutivos de elementos da lista valores, que são somados até obtermos a soma total, que é 15.

Multiplicando valores numéricos

Da mesma forma, se você quiser multiplicar todos os valores em uma lista, pode usar o reduce():

from functools import reduce
valores = [1, 2, 3, 4, 5]
produto_total = reduce(lambda x, y: x * y, valores)
print(produto_total) # output: 120

Neste exemplo, usamos o reduce() com uma função lambda que multiplica os valores x e y e os aplica a pares consecutivos de elementos da lista valores. O resultado é o produto total dos valores, que é 120.

Encontrando o valor mínimo e máximo

Você também pode usar o reduce() para encontrar o valor mínimo e máximo de uma lista de números:

from functools import reduce
valores = [4, 2, 7, 1, 5]
valor_minimo = reduce(lambda x, y: x if x < y else y, valores)
valor_maximo = reduce(lambda x, y: x if x > y else y, valores)
print(valor_minimo) # output: 1
print(valor_maximo) # output: 7

Neste exemplo, usamos o reduce() com uma função lambda que compara os valores x e y e retorna o menor valor para encontrar o valor mínimo da lista valores. Da mesma forma, usamos outra função lambda para encontrar o valor máximo da lista.

Verificando se todos os valores são verdadeiros

Suponha que você tenha uma lista de valores booleanos e deseje verificar se todos os valores são True. Você pode usar o reduce() para fazer isso:

from functools import reduce
valores = [True, True, False, True]
todos_verdadeiros = reduce(lambda x, y: x and y, valores)
print(todos_verdadeiros) # output: False

Neste exemplo, usamos o reduce() com uma função lambda que realiza a operação lógica “AND” entre os valores x e y. O resultado é False porque existe pelo menos um valor False na lista.

Verificando se algum valor é verdadeiro

Da mesma forma, se você quiser verificar se pelo menos um valor é True em uma lista de valores booleanos, pode usar o reduce() com a operação lógica “OR”:

from functools import reduce
valores = [False, False, True, False]
algum_verdadeiro = reduce(lambda x, y: x or y, valores)
print(algum_verdadeiro) # output: True

Neste exemplo, usamos o reduce() com uma função lambda que realiza a operação lógica “OR” entre os valores x e y. O resultado é True porque pelo menos um valor na lista é True.

Comparando reduce() e accumulate()

Python também fornece outra função semelhante ao reduce() chamada accumulate(). A principal diferença entre reduce() e accumulate() é que accumulate() retorna todos os valores intermediários enquanto faz a redução.

Vamos fazer uma comparação entre as duas funções usando o exemplo da soma de valores numéricos:

from functools import reduce, accumulate
valores = [1, 2, 3, 4, 5]
soma_total_reduce = reduce(lambda x, y: x + y, valores)
print(soma_total_reduce) # output: 15
soma_total_accumulate = list(accumulate(valores, lambda x, y: x + y))
print(soma_total_accumulate) # output: [1, 3, 6, 10, 15]

Neste exemplo, usamos o reduce() para obter a soma total dos valores da lista valores, que é 15. Em seguida, usamos o accumulate() com a mesma função lambda para obter uma lista de todos os valores intermediários durante a redução, que é [1, 3, 6, 10, 15].

Considerando Desempenho e Legibilidade

Ao decidir usar o reduce() ou outras ferramentas alternativas, é importante considerar o desempenho e a legibilidade do código.

O Desempenho é Importante

Embora o reduce() seja uma ferramenta poderosa para resolver problemas de redução, é importante notar que ele pode não ser a opção mais eficiente em todos os casos. O desempenho do reduce() depende da quantidade de elementos no iterável e da complexidade da função que está sendo aplicada.

Se você estiver lidando com um grande número de elementos ou uma função complexa, pode ser mais eficiente usar outras soluções mais diretas ou ferramentas específicas, como a biblioteca NumPy para manipulação de arrays numéricos.

A Legibilidade Conta

Além do desempenho, é fundamental considerar a legibilidade do código. Embora o reduce() possa ser uma solução concisa para problemas de redução, pode ser mais difícil de entender e manter em comparação com soluções mais diretas.

Ao optar por usar o reduce() ou outras ferramentas, é importante equilibrar a eficiência com a legibilidade e escolher a solução mais adequada para o caso específico.

Conclusão

O reduce() do Python é uma função útil para aplicar uma redução ou dobramento a um iterável. Ele é amplamente usado por desenvolvedores com experiência em programação funcional, mas existem outras ferramentas alternativas do Python que podem ser mais Pythonicas, legíveis e eficientes em determinados casos.

Neste tutorial, você aprendeu como usar o reduce() do Python e explorou alguns casos de uso comuns, como somar valores numéricos, multiplicar valores numéricos, encontrar o valor mínimo e máximo, verificar se todos os valores são verdadeiros e verificar se algum valor é verdadeiro. Você também comparou o reduce() e o accumulate() e considerou o desempenho e a legibilidade do código.

Com esse conhecimento, você poderá escolher as ferramentas mais adequadas para resolver problemas de redução ou dobramento em Python.


Gostou deste artigo? Clique aqui para nos dizer o que você achou!

Compartilhe este artigo nas redes sociais: