• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

M6

[Python] Map, Reduce e Filter

10 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bons post's M6 estou a gostar de ler :thumbsup:

Keep Going :thumbsup:

Obrigado. :D

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bons post's M6 estou a gostar de ler :D

Keep Going :thumbsup:

Obrigado. :D

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.

Ok :thumbsup: Obrigado :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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!!! :thumbsup:

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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!!! :thumbsup:

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)

Tens razão, já actualizei. Estava um grande molho de bróculos e nem me havia apercebido!

Obrigado. :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

Can Your Programming Language Do This?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

São realmente coisas úteis...Pena que sejam retiradas do python 3k

At one point lambda was slated for removal in Python 3000. Unfortunately no one was able to come up with a better way of providing anonymous functions. And so lambda is here to stay.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora