2. 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
3. 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 .
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 corpo deve conter apenas expressão.
Não possui a instrução return.
Seguem o modelo:
lambda arg1,arg2,arg3,argn: expressão
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.
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.
16. 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)]
17. 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.
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 – 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.
21. 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('/')])
22. 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.
23. Zip
Unzip
zip(*zipada)
nomes = [ ("Rodrigo","Lira"),("Rui","Ricardo")]
nome,sobrenome = zip(*nomes)
#sobrenome ('Lira', 'Ricardo')
#nome ('Rodrigo', 'Rui')