Python Funcional Rodrigo Lira
Rodrigo Lira Aluno do 5º período de Engenharia da Computação na UPE. Estuda Python desde o final de 2008. Participa dos grupos Python Poli e do PUG-PE. http://tiny.cc/rodrigolira
Programação Funcional Paradigma que enfatiza a aplicação de funções. LISP (LISt Processing) criada em 1958 no MIT por John McCarthy. Haskell, Common Lisp, Miranda, Erlang, Scheme, ML .
Programação Funcional --Haskell somaLista :: [Int] -> Int somaLista [] = 0 somaLista (a:x) = a + somaLista x
Python Funcional Multiparadigma (Imperativo, OO, Funcional) Possui muitas das ferramentas funcionais desde a sua versão 1.0 . lambda, map, filter, reduce, zip ,list comprehensions providenciam as ferramentas básicas para programação funcional.
Python Funcional Função Versão Contribuição lambda, map, filter, reduce 1.0.0 Amrit Prem sum 2.3 ---- any,all 2.5 Raymond Hettinger List comprehensions, zip 2.0 beta 1 Greg Ewing, Skip Montanaro e Thomas Wouters
Lambda Função anônima. Seu corpo deve conter apenas expressão. Não possui a instrução return. Seguem o modelo: lambda arg1,arg2,arg3,argn: expressão
Lambda Definição (lambda x,y: x+y)(10,2) #12 “Nomeando” func=lambda x: x**2+10 print func(100) #110 Parâmetros opcionais func=lambda x,y=3: x>y func(1) #False func(1,-1) #True
BDFL x Lambda “A maioria dos usuários do Python não estão familiarizados com Lisp ou Scheme, por isso o nome é confuso, também existe um equívoco generalizado que lambda possa fazer coisas que uma função aninhada não pode. (...) Mesmo com um nome melhor, eu acho que ter as duas opções lado a lado, exige apenas os programadores a pensar em fazer uma escolha que é irrelevante para o seu programa, não tendo a escolha simplifica o processo de pensamento. Além disso, uma vez que map(), filter() e reduce() sumirão, não há um monte de lugares onde você realmente precisa escrever funções lambda;“ Guido van Rossum http://is.gd/e8cCv
Map Função de mapeamento. map(função ou None,seq1,seq2,seqn) Retorna uma lista com o resultado de função(item). Retorna um iterator em Python 3.
Map map(lambda x: x>=0,[1,-2,3,45,0,-1223]) #[True, False, True, True, True, False] map(pow,[1,2,3,4],[3,2,1]) # 4**None map(None,(1,2,3),[2,2,3,4]) #Comportamento semelhante à zip
Filter Aplicação de filtro filter(função ou None,seq) Tem como retorno uma sequência formada por todos os itens em que func(item) é True. Ifilterfalse tem comportamento inverso. Retornar um iterator em Python 3.
Filter #Palíndromos filter(lambda x: x[::-1]==x,["casa","ovo","palavra","radar"]) ['ovo', 'radar'] #3025 = (30 + 25) = 55² = 3025 filter(lambda x: sum(divmod(x,100))**2==x,xrange(1000,10000)) #[2025, 3025, 9801]
List Comprehesions Fornece uma maneira mais sucinta para criação de lista. [ var for var in seq if <condição> ] If é opcional PEP 202
List Comprehesions Comportamento Filter [ var for var in seq if func(var) ] Comportamento Map [ func(var) for var in seq]
List Comprehesions [i for i in range(20) if i%2 == 0] #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] [ord(x) for x in "Python"] [80, 121, 116, 104, 111, 110] #Diretórios import os [path for path in os.listdir(".") if os.path.isdir(path)]
Reduce Aplica uma função binária aos elementos da sequência, e depois reduz a um único valor. reduce(função,seq1[,inicializador]) Pode receber uma valor para inicialização. A partir de Python 2.7 foi movido para functools.
Reduce Funcionamento reduce(lambda x, y: x*y, [1, 2, 3, 4, 5]) ((((1*2)*3)*4)*5) = 120
Round 2 Se você está matando reduce(), por que você está mantendo map() e filter()? Eu não estou matando reduce() porque eu odeio programação funcional, eu estou matando porque quase todos os códigos usando reduce() é menos legível que a mesma coisa escrita, utilizando um loop e uma variável acumulador. Por outro lado, map() e filter() muitas vezes são úteis e quando usado com uma função pré-existentes (por exemplo, um built-in) são mais claros do que uma list comprehensions ou generators. Python 3000 FAQ http://is.gd/egQKe
Any/All all – Retorna True se todos os elementos do iterable for True caso contrário retorna False. Se o iterable for vazio retorna True. any – Retorna True se algum dos elementos do iterable for True caso contrário retorna False. Se o iterable for vazio retorna False. Ambas foram pedidos de Guido.
Any/All any((True,False,True,False,False)) #True #Há algum múltiplo de 3 ou 5 any(map(lambda x: x%3==0 or x%5==0,(7,11,3,4,2))) #True #Só existe arquivo na pasta raiz? from os import path from os import listdir all([path.isfile(caminho) for caminho in listdir('/')])
Zip Retorna uma lista cujos elementos são tuplas resultantes de cada um dos elementos de uma ou mais sequências de entrada seq1, seq2, seqN. zip(seq1,seq2,seqn) A lista resultante é truncada ao tamanho para o tamanho da menor lista.
Zip Unzip zip(*zipada) nomes = [ ("Rodrigo","Lira"),("Rui","Ricardo")] nome,sobrenome = zip(*nomes) #sobrenome ('Lira', 'Ricardo') #nome ('Rodrigo', 'Rui')

Python Funcional

  • 1.
    Python Funcional Rodrigo Lira
  • 2.
    Rodrigo Lira Aluno do5º período de Engenharia da Computação na UPE. Estuda Python desde o final de 2008. Participa dos grupos Python Poli e do PUG-PE. http://tiny.cc/rodrigolira
  • 3.
    Programação Funcional Paradigmaque enfatiza a aplicação de funções. LISP (LISt Processing) criada em 1958 no MIT por John McCarthy. Haskell, Common Lisp, Miranda, Erlang, Scheme, ML .
  • 4.
    Programação Funcional --Haskell somaLista :: [Int] -> Int somaLista [] = 0 somaLista (a:x) = a + somaLista x
  • 5.
    Python Funcional Multiparadigma (Imperativo,OO, Funcional) Possui muitas das ferramentas funcionais desde a sua versão 1.0 . lambda, map, filter, reduce, zip ,list comprehensions providenciam as ferramentas básicas para programação funcional.
  • 6.
    Python Funcional Função Versão Contribuição lambda, map, filter, reduce 1.0.0 Amrit Prem sum 2.3 ---- any,all 2.5 Raymond Hettinger List comprehensions, zip 2.0 beta 1 Greg Ewing, Skip Montanaro e Thomas Wouters
  • 7.
    Lambda Função anônima. Seu corpodeve conter apenas expressão. Não possui a instrução return. Seguem o modelo: lambda arg1,arg2,arg3,argn: expressão
  • 8.
    Lambda Definição (lambda x,y: x+y)(10,2)#12 “Nomeando” func=lambda x: x**2+10 print func(100) #110 Parâmetros opcionais func=lambda x,y=3: x>y func(1) #False func(1,-1) #True
  • 9.
    BDFL x Lambda “A maioria dos usuários do Python não estão familiarizados com Lisp ou Scheme, por isso o nome é confuso, também existe um equívoco generalizado que lambda possa fazer coisas que uma função aninhada não pode. (...) Mesmo com um nome melhor, eu acho que ter as duas opções lado a lado, exige apenas os programadores a pensar em fazer uma escolha que é irrelevante para o seu programa, não tendo a escolha simplifica o processo de pensamento. Além disso, uma vez que map(), filter() e reduce() sumirão, não há um monte de lugares onde você realmente precisa escrever funções lambda;“ Guido van Rossum http://is.gd/e8cCv
  • 10.
    Map Função de mapeamento. map(função ou None,seq1,seq2,seqn) Retorna uma lista com o resultado de função(item). Retorna um iterator em Python 3.
  • 11.
    Map map(lambda x: x>=0,[1,-2,3,45,0,-1223]) #[True,False, True, True, True, False] map(pow,[1,2,3,4],[3,2,1]) # 4**None map(None,(1,2,3),[2,2,3,4]) #Comportamento semelhante à zip
  • 12.
    Filter Aplicação de filtro filter(função ou None,seq) Tem como retorno uma sequência formada por todos os itens em que func(item) é True. Ifilterfalse tem comportamento inverso. Retornar um iterator em Python 3.
  • 13.
    Filter #Palíndromos filter(lambda x: x[::-1]==x,["casa","ovo","palavra","radar"]) ['ovo','radar'] #3025 = (30 + 25) = 55² = 3025 filter(lambda x: sum(divmod(x,100))**2==x,xrange(1000,10000)) #[2025, 3025, 9801]
  • 14.
    List Comprehesions Fornece umamaneira mais sucinta para criação de lista. [ var for var in seq if <condição> ] If é opcional PEP 202
  • 15.
    List Comprehesions Comportamento Filter [ var for var in seq if func(var) ] Comportamento Map [ func(var) for var in seq]
  • 16.
    List Comprehesions [i fori in range(20) if i%2 == 0] #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] [ord(x) for x in "Python"] [80, 121, 116, 104, 111, 110] #Diretórios import os [path for path in os.listdir(".") if os.path.isdir(path)]
  • 17.
    Reduce Aplica uma funçãobinária aos elementos da sequência, e depois reduz a um único valor. reduce(função,seq1[,inicializador]) Pode receber uma valor para inicialização. A partir de Python 2.7 foi movido para functools.
  • 18.
    Reduce Funcionamento reduce(lambda x, y:x*y, [1, 2, 3, 4, 5]) ((((1*2)*3)*4)*5) = 120
  • 19.
    Round 2 Se você está matando reduce(), por que você está mantendo map() e filter()? Eu não estou matando reduce() porque eu odeio programação funcional, eu estou matando porque quase todos os códigos usando reduce() é menos legível que a mesma coisa escrita, utilizando um loop e uma variável acumulador. Por outro lado, map() e filter() muitas vezes são úteis e quando usado com uma função pré-existentes (por exemplo, um built-in) são mais claros do que uma list comprehensions ou generators. Python 3000 FAQ http://is.gd/egQKe
  • 20.
    Any/All all – RetornaTrue se todos os elementos do iterable for True caso contrário retorna False. Se o iterable for vazio retorna True. any – Retorna True se algum dos elementos do iterable for True caso contrário retorna False. Se o iterable for vazio retorna False. Ambas foram pedidos de Guido.
  • 21.
    Any/All any((True,False,True,False,False)) #True #Há algummúltiplo de 3 ou 5 any(map(lambda x: x%3==0 or x%5==0,(7,11,3,4,2))) #True #Só existe arquivo na pasta raiz? from os import path from os import listdir all([path.isfile(caminho) for caminho in listdir('/')])
  • 22.
    Zip Retorna uma listacujos elementos são tuplas resultantes de cada um dos elementos de uma ou mais sequências de entrada seq1, seq2, seqN. zip(seq1,seq2,seqn) A lista resultante é truncada ao tamanho para o tamanho da menor lista.
  • 23.
    Zip Unzip zip(*zipada) nomes = [ ("Rodrigo","Lira"),("Rui","Ricardo")] nome,sobrenome = zip(*nomes) #sobrenome ('Lira', 'Ricardo') #nome ('Rodrigo', 'Rui')