M6 Posted July 26, 2006 at 09:57 AM Report Share #40336 Posted July 26, 2006 at 09:57 AM 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 More sharing options...
UnKnowN Posted July 26, 2006 at 10:01 AM Report Share #40338 Posted July 26, 2006 at 10:01 AM Bons post's M6 estou a gostar de ler 👍 Keep Going 👍 Link to comment Share on other sites More sharing options...
M6 Posted July 26, 2006 at 10:11 AM Author Report Share #40344 Posted July 26, 2006 at 10:11 AM 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 More sharing options...
UnKnowN Posted July 26, 2006 at 10:39 AM Report Share #40354 Posted July 26, 2006 at 10:39 AM Ok 👍 Obrigado 😄 Link to comment Share on other sites More sharing options...
PaLobo Posted July 26, 2006 at 11:40 AM Report Share #40373 Posted July 26, 2006 at 11:40 AM 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) http://s4.bitefight.com.pt/c.php?uid=20666 Link to comment Share on other sites More sharing options...
M6 Posted July 26, 2006 at 01:00 PM Author Report Share #40382 Posted July 26, 2006 at 01:00 PM Tens razão, já actualizei. Estava um grande molho de bróculos e nem me havia apercebido! Obrigado. 👍 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 More sharing options...
PaLobo Posted July 26, 2006 at 01:08 PM Report Share #40387 Posted July 26, 2006 at 01:08 PM Anytime... 👍 Sempre às ordems! http://s4.bitefight.com.pt/c.php?uid=20666 Link to comment Share on other sites More sharing options...
M6 Posted August 2, 2006 at 08:29 AM Author Report Share #41648 Posted August 2, 2006 at 08:29 AM 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 More sharing options...
p4n Posted February 8, 2007 at 01:25 PM Report Share #81190 Posted February 8, 2007 at 01:25 PM São realmente coisas úteis...Pena que sejam retiradas do python 3k Link to comment Share on other sites More sharing options...
Triton Posted February 8, 2007 at 02:55 PM Report Share #81203 Posted February 8, 2007 at 02:55 PM 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. <3 life Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now