python funcional

23
Python Funcional Rodrigo Lira

Upload: pugpe

Post on 21-Dec-2014

1.005 views

Category:

Technology


5 download

DESCRIPTION

Palestra realizada por Rodrigo Lira no VI ENCONTRO do PUG-PE sediada na UFRPE - Recife - Pernambuco dia 14/08/2010.

TRANSCRIPT

Page 1: Python Funcional

Python FuncionalRodrigo Lira

Page 2: Python Funcional

Rodrigo LiraAluno 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

Page 3: Python Funcional

Programação FuncionalParadigma 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 .

Page 4: Python Funcional

--HaskellsomaLista :: [Int] -> IntsomaLista [] = 0somaLista (a:x) = a + somaLista x

Programação Funcional

Page 5: Python Funcional

Python FuncionalMultiparadigma (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.

Page 6: Python Funcional

Função Versão Contribuiçãolambda, 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

Python Funcional

Page 7: Python Funcional

LambdaFunçã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

Page 8: Python Funcional

LambdaDefinição(lambda x,y: x+y)(10,2) #12

“Nomeando”func=lambda x: x**2+10 print func(100) #110

Parâmetros opcionaisfunc=lambda x,y=3: x>yfunc(1) #Falsefunc(1,-1) #True

Page 9: Python Funcional

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

Page 10: Python Funcional

MapFunção de mapeamento.

Retorna uma lista com o resultado de função(item).

Retorna um iterator em Python 3.

map(função ou None,seq1,seq2,seqn)

Page 11: Python Funcional

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

Page 12: Python Funcional

FilterAplicação de filtro

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(função ou None,seq)

Page 13: Python Funcional

Filter#Palíndromosfilter(lambda x: x[::-1]==x,["casa","ovo","palavra","radar"])['ovo', 'radar']

#3025 = (30 + 25) = 55² = 3025filter(lambda x: sum(divmod(x,100))**2==x,xrange(1000,10000))#[2025, 3025, 9801]

Page 14: Python Funcional

List ComprehesionsFornece uma maneira mais sucinta para criação de lista.

[ var for var in seq if <condição> ]

If é opcional

PEP 202

Page 15: Python Funcional

List Comprehesions

Comportamento Filter

[ var for var in seq if func(var) ]

Comportamento Map

[ func(var) for var in seq]

Page 16: Python Funcional

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óriosimport os[path for path in os.listdir(".") if os.path.isdir(path)]

Page 17: Python Funcional

ReduceAplica 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.

Page 18: Python Funcional

Reduce

Funcionamento

reduce(lambda x, y: x*y, [1, 2, 3, 4, 5])

((((1*2)*3)*4)*5) = 120

Page 19: Python Funcional

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

Round 2

Page 20: Python Funcional

Any/Allall – 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.

Page 21: Python Funcional

Any/All

any((True,False,True,False,False)) #True

#Há algum múltiplo de 3 ou 5any(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 pathfrom os import listdirall([path.isfile(caminho) for caminho in listdir('/')])

Page 22: Python Funcional

ZipRetorna 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.

Page 23: Python Funcional

ZipUnzip

zip(*zipada)

nomes = [ ("Rodrigo","Lira"),("Rui","Ricardo")]nome,sobrenome = zip(*nomes)#sobrenome ('Lira', 'Ricardo')#nome ('Rodrigo', 'Rui')