Jump to content

[Python] Map, Reduce e Filter


M6

Recommended Posts

O Python tem umas coisas engraças que normalmente não são exploradas por quem usa esta linguagem.

Map, Reduce e Filter são três funcionalidades "herdadas" da programação funcional e que são bastante úteis na resolução de certos problemas.

Map

Recebe dois argumentos, uma função e uma lista, e usa cada elemento da lista como argumento da função, retornando uma nova lista com o resultado.

lista = [1,2,-3,4,5,-9]
def quadrado(n):
   return n*n

fazendo

map(quadrado, lista)

obtemos [1, 4, 9, 16, 25, 81].

Fazendo a transição com uma função lambda, ficamos ainda com mais flexibilidade:

map((lambda x: x*x), lista)


Filter

Também recebe uma função e uma lista, à semelhança do map, mas a sua funcionalidade é filtrar os elementos da lista através de uma função booleana, retornando apenas aqueles que cumprem com a função. Ou seja, um elemento fará parte do resultado se e só se a sua avaliação através da função é verdadeira.

lista = [1,2,-3,4,5,-9]
def e_par(n):
   return n % 2 == 0

fazendo

filter(e_par,list)

obtemos [2, 4], pois mais nenhum outro elemento é par.

Fazendo a transição com uma função lambda, ficamos ainda com mais flexibilidade:

filter((lambda x: x%2 == 0), lista)

Nota:, reparem que aplicando map em vez de filter obtêm [False, True, False, True, False, False].


Reduce

Também recebe uma função e uma lista, à semelhança do map e do filter, mas a função recebe dois argumentos, e não apenas um como acontece nas outras funções. O primeiro argumento é o elemento actual da lista e o segundo é o resultado da última chama à função (caso exista).

lista = [1,2,-3,4,5,-9]
def soma(a, b):
   return a+b

fazendo

reduce(soma, lista)

obtemos 0, pois ( ( ( (1+2) + (-3) ) + 4 ) + 5 ) + (-9) ) = 0.

Fazendo a transição com uma função lambda, ficamos ainda com mais flexibilidade:

reduce((lambda x, y: x + y), lista)

Existe alguma controversia à volta destas funções, mas tal está fora do âmbito desta explicação.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

Obrigado. 😄

Infelizmente mas agora vou ter de ficar por aqui, não tenho muito tempo.

Mas se gostas deste tipo de coisas, lê o Tutorial de Haskell do Rui Carlos, pois este tipo de paradigma é de programação funcional, onde se enquadra o Haskell, Lisp, CAML/ML, Scheme e outras linguagens.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

Onde tens:

...

Filter

...

lista = [1,2,-3,4,5,-9]
def e_par(n):
    return n % 2 == 0

fazendo

filter(is_even,list)

obtemos [2, 4], pois mais nenhum outro elemento é par.

...

não devia ser:

filter(e_par,list)

uma vez que a função declarada foi:

def e_par(n):
    return n % 2 == 0

De resto... Very NICE!!! 👍

Só mais uma coisa... Tens algum texto repetido (pelo menos parece). Logo após iniciares a explicação do reduce repetes:

Map, Reduce e Filter são três funcionalidades "herdadas" da programação funcional e que são bastante úteis na resolução de certos problemas.

Map

Recebe dois argumentos, uma função e uma lista, e usa cada elemento da lista como argumento da função, retornando uma nova lista com o resultado.

lista = [1,2,-3,4,5,-9]
def quadrado(n):
    return n*n

fazendo

map(quadrado, lista)

obtemos [1, 4, 9, 16, 25, 81].

Fazendo a transição com uma função lambda, ficamos ainda com mais flexibilidade:

Código

map((lambda x: x*x), lista)

Link to comment
Share on other sites

Para quem ainda não está "convencido" das potencialidades disto, aconselho a leitura deste artigo:

Can Your Programming Language Do This?

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

  • 6 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.