SlideShare uma empresa Scribd logo
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')

Mais conteúdo relacionado

Mais procurados

Programação funcional
Programação funcionalProgramação funcional
Programação funcional
LP Maquinas
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
Natan Mai
 
Pilha
PilhaPilha
Python - Programação funcional
Python - Programação funcionalPython - Programação funcional
Python - Programação funcional
fabiocerqueira
 
Pilha e Fila Estática
Pilha e Fila EstáticaPilha e Fila Estática
Pilha e Fila Estática
Sérgio Souza Costa
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
Adriano Teixeira de Souza
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
Luciano Ramalho
 
A Linguagem Lua - Uma abordagem inicial
A Linguagem Lua - Uma abordagem inicialA Linguagem Lua - Uma abordagem inicial
A Linguagem Lua - Uma abordagem inicial
Flávio Schuindt
 
Haskell aula3 listas
Haskell aula3 listasHaskell aula3 listas
Haskell aula3 listas
CRISLANIO MACEDO
 
Pilha e Fila Dinamica
Pilha e Fila DinamicaPilha e Fila Dinamica
Pilha e Fila Dinamica
Sérgio Souza Costa
 
Otimizações em Sistemas de Armazenamento mediadas por anotações em Metadados
Otimizações em Sistemas de Armazenamento mediadas por anotações em MetadadosOtimizações em Sistemas de Armazenamento mediadas por anotações em Metadados
Otimizações em Sistemas de Armazenamento mediadas por anotações em Metadados
ricardoas
 
Estrutura de dados em Java - Pilhas
Estrutura de dados em Java - PilhasEstrutura de dados em Java - Pilhas
Estrutura de dados em Java - Pilhas
Adriano Teixeira de Souza
 
Pilha e filas
Pilha e filasPilha e filas
Pilha e filas
Patrick Silva
 
Linguagem lua
Linguagem luaLinguagem lua
Linguagem lua
Paulo Henrique
 
Apresentação Lua
Apresentação LuaApresentação Lua
Apresentação Lua
Filipe Augusto
 
Pilhas e Filas
Pilhas e FilasPilhas e Filas
Pilhas e Filas
CriatividadeZeroDocs
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
Adriano Teixeira de Souza
 
Tutorial aed iii 008 - algoritmo de ordenação heapsort
Tutorial aed iii   008 - algoritmo de ordenação heapsortTutorial aed iii   008 - algoritmo de ordenação heapsort
Tutorial aed iii 008 - algoritmo de ordenação heapsort
Flávio Freitas
 
Apresentação sobre a linguagem lua
Apresentação sobre a linguagem luaApresentação sobre a linguagem lua
Apresentação sobre a linguagem lua
Rafael Sanches
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
Ricardo Bolanho
 

Mais procurados (20)

Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Pilha
PilhaPilha
Pilha
 
Python - Programação funcional
Python - Programação funcionalPython - Programação funcional
Python - Programação funcional
 
Pilha e Fila Estática
Pilha e Fila EstáticaPilha e Fila Estática
Pilha e Fila Estática
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
A Linguagem Lua - Uma abordagem inicial
A Linguagem Lua - Uma abordagem inicialA Linguagem Lua - Uma abordagem inicial
A Linguagem Lua - Uma abordagem inicial
 
Haskell aula3 listas
Haskell aula3 listasHaskell aula3 listas
Haskell aula3 listas
 
Pilha e Fila Dinamica
Pilha e Fila DinamicaPilha e Fila Dinamica
Pilha e Fila Dinamica
 
Otimizações em Sistemas de Armazenamento mediadas por anotações em Metadados
Otimizações em Sistemas de Armazenamento mediadas por anotações em MetadadosOtimizações em Sistemas de Armazenamento mediadas por anotações em Metadados
Otimizações em Sistemas de Armazenamento mediadas por anotações em Metadados
 
Estrutura de dados em Java - Pilhas
Estrutura de dados em Java - PilhasEstrutura de dados em Java - Pilhas
Estrutura de dados em Java - Pilhas
 
Pilha e filas
Pilha e filasPilha e filas
Pilha e filas
 
Linguagem lua
Linguagem luaLinguagem lua
Linguagem lua
 
Apresentação Lua
Apresentação LuaApresentação Lua
Apresentação Lua
 
Pilhas e Filas
Pilhas e FilasPilhas e Filas
Pilhas e Filas
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Tutorial aed iii 008 - algoritmo de ordenação heapsort
Tutorial aed iii   008 - algoritmo de ordenação heapsortTutorial aed iii   008 - algoritmo de ordenação heapsort
Tutorial aed iii 008 - algoritmo de ordenação heapsort
 
Apresentação sobre a linguagem lua
Apresentação sobre a linguagem luaApresentação sobre a linguagem lua
Apresentação sobre a linguagem lua
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
 

Semelhante a Python Funcional

Python Emsl2009
Python Emsl2009Python Emsl2009
Python Emsl2009
Julio Cesar Eiras Melanda
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introdução
Arthur Xavier
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional Interfaces
DevCamp Campinas
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
Denis Costa
 
Scheme
SchemeScheme
Scheme
danielppgua
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
Diogo Gomes
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
Rafael Cassau
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
Bruno Rocha
 
Introdução ao paradigma funcional com scala
Introdução ao paradigma funcional com scalaIntrodução ao paradigma funcional com scala
Introdução ao paradigma funcional com scala
Gustavo Fernandes Dos Santos
 
07-lambda.pdf
07-lambda.pdf07-lambda.pdf
07-lambda.pdf
Rodrigo Wanzeler
 
Aula python
Aula pythonAula python
Programação funcional com abap
Programação funcional com abapProgramação funcional com abap
Programação funcional com abap
Raphael Pacheco
 
Python No Terra (2006-12-21)
Python No Terra  (2006-12-21)Python No Terra  (2006-12-21)
Python No Terra (2006-12-21)
Rudá Moura
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
Jocelma Rios
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadas
Éverton Ribeiro
 
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
Ismar Silveira
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
tdc-globalcode
 
Python
PythonPython
Por que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisPor que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionais
Luiz Borba
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
Helder da Rocha
 

Semelhante a Python Funcional (20)

Python Emsl2009
Python Emsl2009Python Emsl2009
Python Emsl2009
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introdução
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional Interfaces
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
 
Scheme
SchemeScheme
Scheme
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Escrevendo modulos python com rust
Escrevendo modulos python com rustEscrevendo modulos python com rust
Escrevendo modulos python com rust
 
Introdução ao paradigma funcional com scala
Introdução ao paradigma funcional com scalaIntrodução ao paradigma funcional com scala
Introdução ao paradigma funcional com scala
 
07-lambda.pdf
07-lambda.pdf07-lambda.pdf
07-lambda.pdf
 
Aula python
Aula pythonAula python
Aula python
 
Programação funcional com abap
Programação funcional com abapProgramação funcional com abap
Programação funcional com abap
 
Python No Terra (2006-12-21)
Python No Terra  (2006-12-21)Python No Terra  (2006-12-21)
Python No Terra (2006-12-21)
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadas
 
Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2Paradigmas de Linguagens de programacao - Aula #2
Paradigmas de Linguagens de programacao - Aula #2
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
 
Python
PythonPython
Python
 
Por que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionaisPor que voce precisa (re)aprender linguagens funcionais
Por que voce precisa (re)aprender linguagens funcionais
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 

Mais de pugpe

Projeto Amadeus
Projeto AmadeusProjeto Amadeus
Projeto Amadeus
pugpe
 
E o que danado é o PUG-PE?
E o que danado é o PUG-PE?E o que danado é o PUG-PE?
E o que danado é o PUG-PE?
pugpe
 
Intro
IntroIntro
Intro
pugpe
 
Palestra sobre Collections com Python
Palestra sobre Collections com PythonPalestra sobre Collections com Python
Palestra sobre Collections com Python
pugpe
 
Construindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com PythonConstruindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com Python
pugpe
 
Rain Toolbox - Previsão de Chuvas
Rain Toolbox -  Previsão de ChuvasRain Toolbox -  Previsão de Chuvas
Rain Toolbox - Previsão de Chuvas
pugpe
 
Automatizando tarefas com Python
Automatizando tarefas com PythonAutomatizando tarefas com Python
Automatizando tarefas com Python
pugpe
 
NoSQL com Cassandra e Python
NoSQL com Cassandra e PythonNoSQL com Cassandra e Python
NoSQL com Cassandra e Python
pugpe
 
Visualização da Informação
Visualização da InformaçãoVisualização da Informação
Visualização da Informação
pugpe
 
Python e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMPython e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMM
pugpe
 
Criando comunidades bem sucedidas
Criando comunidades bem sucedidasCriando comunidades bem sucedidas
Criando comunidades bem sucedidas
pugpe
 
Palestra sobre Inteligência Coletiva
Palestra sobre Inteligência ColetivaPalestra sobre Inteligência Coletiva
Palestra sobre Inteligência Coletiva
pugpe
 
Blender Com Python
Blender Com PythonBlender Com Python
Blender Com Python
pugpe
 
Wikilytics
WikilyticsWikilytics
Wikilytics
pugpe
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engine
pugpe
 
Qml + Python
Qml + PythonQml + Python
Qml + Python
pugpe
 
Pip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para PythonPip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para Python
pugpe
 
Pug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debuggerPug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debugger
pugpe
 
Pug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debuggerPug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debugger
pugpe
 
Python e Django
Python e DjangoPython e Django
Python e Django
pugpe
 

Mais de pugpe (20)

Projeto Amadeus
Projeto AmadeusProjeto Amadeus
Projeto Amadeus
 
E o que danado é o PUG-PE?
E o que danado é o PUG-PE?E o que danado é o PUG-PE?
E o que danado é o PUG-PE?
 
Intro
IntroIntro
Intro
 
Palestra sobre Collections com Python
Palestra sobre Collections com PythonPalestra sobre Collections com Python
Palestra sobre Collections com Python
 
Construindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com PythonConstruindo uma startup em 54 horas com Python
Construindo uma startup em 54 horas com Python
 
Rain Toolbox - Previsão de Chuvas
Rain Toolbox -  Previsão de ChuvasRain Toolbox -  Previsão de Chuvas
Rain Toolbox - Previsão de Chuvas
 
Automatizando tarefas com Python
Automatizando tarefas com PythonAutomatizando tarefas com Python
Automatizando tarefas com Python
 
NoSQL com Cassandra e Python
NoSQL com Cassandra e PythonNoSQL com Cassandra e Python
NoSQL com Cassandra e Python
 
Visualização da Informação
Visualização da InformaçãoVisualização da Informação
Visualização da Informação
 
Python e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMPython e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMM
 
Criando comunidades bem sucedidas
Criando comunidades bem sucedidasCriando comunidades bem sucedidas
Criando comunidades bem sucedidas
 
Palestra sobre Inteligência Coletiva
Palestra sobre Inteligência ColetivaPalestra sobre Inteligência Coletiva
Palestra sobre Inteligência Coletiva
 
Blender Com Python
Blender Com PythonBlender Com Python
Blender Com Python
 
Wikilytics
WikilyticsWikilytics
Wikilytics
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engine
 
Qml + Python
Qml + PythonQml + Python
Qml + Python
 
Pip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para PythonPip - Instalando Pacotes facilmente para Python
Pip - Instalando Pacotes facilmente para Python
 
Pug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debuggerPug pe vii - luciano rodrigues - debugger
Pug pe vii - luciano rodrigues - debugger
 
Pug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debuggerPug pe viii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debugger
 
Python e Django
Python e DjangoPython e Django
Python e Django
 

Python Funcional

  • 1. Python Funcional Rodrigo Lira
  • 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
  • 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 uma maneira 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 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.
  • 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 – 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')