python iii - cin.ufpe.brpjs/funcional/workshop-python.3.pdf · programação funcional...

26
2 1 4 3 5 6 7 8 9 Python Python III III por: Rodrigo Peixoto por: Rodrigo Peixoto

Upload: vuongphuc

Post on 15-Dec-2018

242 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

21 43 5 6 7 8 9

PythonPythonIIIIII

por: Rodrigo Peixotopor: Rodrigo Peixoto

Page 2: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

RoteiroRoteiro

● Programação Python funcional– Compressão de listas

● Exercício

– Lambda calculus● Exercício

– Ferramentas funcionais de python● Exercício

Page 3: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Programação funcionalProgramação funcional

“Programação funcional é um paradigma de programação que trata a computação como uma avaliação de funções matemáticas e que evita estados ou dados mutáveis.

[...] em uma programação estritamente funcional, não há

alocação explícita de memória, nem declaração explícita de variáveis.”

Wikipédia

Page 4: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Programação funcionalProgramação funcional

● Vantagens:– menos código;

– maior abstração;

– mais poder!!!

● Desvantagens:– códigos mágicos, pouco legíveis;

– em certos casos baixo desempenho, não se deve abusar do funcional (coisas mais comuns às vezes são mais otimizadas).

Page 5: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Compressão de listas (Revisão)Compressão de listas (Revisão)

Python suporta compressão de listas, cria listas de forma fácil e rápida. O uso de compressão de

listas é bem comum em matemática. Por exemplo:● S = {x² : x in {0 ... 9}}● M = {x | x in S and x even}

Em python temos:>>>s = [x**2 for x in range(10)]

>>>m = [x for x in s if x%2 == 0]

Page 6: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Compressão de listas(2)Compressão de listas(2)

A formação geral de uma compressão de lista é:lista_retonada = [(item,...).função() for (item, ...) in

iterator_usado if condições and/or condições]

As possibilidades são muitas, pode-se manipular listas, tuplas, dicionários, qualquer iterator, generator entre outros *rators, de forma fácil.Por exemplo (uma lista de strings):>>>nomes_sujos = ["teste \r\n ", " \n \

...lista","compressão \n\n "]

>>>nomes_limpos = [x.strip() for x in nomes_sujos]

#obs.: procure no help o que faz a função strip

>>>help (“”.strip)

Page 7: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Compressão de listas(3)Compressão de listas(3)

Utilizar dicionários, exemplo:>>>d={"golf":40000,"celta":26000,"Hilux":95000,"fusca":3000}

>>>possibilidades_de_rico = [car for car in d if d[car] < 70000]

>>>minhas_possibilidades = [car for car in d if d[car] < 300]

Em strings (que também são listas):>>> nome = "\n\n ## E#\n##s#t#\n\n#\na f#r\n\na###s\ne \

ti##nh##a# #s##u\n#j\ne##\n\n#i\nr##a#. \n## \n\n\n\n"

>>>"".join([x for x in nome if x!="#" and x!="\n"]).strip()

>>>#torne isso uma pratica, procure na documentacao do shell

>>>help(“”.join)

Page 8: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Compressão de listas(4)Compressão de listas(4)

Exercício:Tenho uma lista de nomes de classes os quais estão

escritos no estilo underline (“nome_outro_nome”) e

agora mudou-se o padrão para CamelCase. Pede-se

um lista com os nomes todos em CamelCase.

>>>lista_nome_classes=[“tela_principal”,”mapa_de_dispositivos”,”classe_negocio_pesado”,”acumulador”,”fim_da_lista_de_de_classes_do_exercicio”]

Page 9: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Compressão de listas(5)Compressão de listas(5)

resposta = ["".join([z.title() for z in y]) for y in [x.split("_") for x in lista_nome_classes]]

Page 10: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Lambda CalculusLambda Calculus

“O cálculo lambda pode ser considerado como uma linguagem de programação abstrata,

[...] é uma linguagem pura, sem efeitos colaterais, e sem

complicações sintáticas.”

wikipédia

Page 11: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Lambda Calculus(2)Lambda Calculus(2)

Python possui uma implementação de lambda calculus denomida 'lambda'.>>>def inc(x):

... return x + 1

>>>inc(2)

3

>>>incl = lambda x : x+1

>>>incl(2)

3

Page 12: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Lambda Calculus(3)Lambda Calculus(3)

As funções lambda podem ser usadas de várias maneiras, abaixo temos um exemplo que é lambda com condições:>>>t = lambda x: (x!='#' and x!='\n')

>>>t('a')

True

>>>t('#')

False

>>>t('\n')

>>>maior = lambda x,y: x>y and x or y

>>>#lambda (params): (condition) and (return1) or (return2)

Page 13: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Lambda Calculus(4)Lambda Calculus(4)

As funções lambda, assim como os métodos em Python, podem receber valores default para os parâmetros, exemplo:>>>maior= lambda x,y=10: x>y and x or y

>>>maior(4)

10

>>>maior(13)

13

>>>maior(12,20)

20

Page 14: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Lambda Calculus(5)Lambda Calculus(5)

Tudo pode complicar...Quem sabe uma recursão? Pois é...funções lambda podem ser recursivas, como:

>>>func=\

lambda x,f=(lambda x,f: x<=1 and 1 or x+f(x-1,f)): f(x,f)

O QUE ISSO FAZ!?!?!?...

Exercício:Transforme a função acima nas funções fatorial e fibonacci.

Page 15: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Ferramentas funcionaisFerramentas funcionais

Python possui algumas built-in functions, baseadas no paradigma funcional que facilitem a manipulação de listas. Abaixo estão as mais importantes:

• map

• reduce

• filter

• zip

• enumerate

• any/all

Page 16: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Ferramentas funcionais - mapFerramentas funcionais - map

A função map é muito usada em liguagens funcionais como Haskell e Lisp. Executa uma função em cada elemento de uma lista ou de um conjunto de listas. Exemplo:>>>pow_2 = lambda a: a**2

>>>map(pow_2, [1,2,3,4,5,6,7,8,9])

>>>map(lambda x,y: x+y,[1,2,3,4,5],[6,7,8,9,10])

>>>#e assim por diante

>>>#map(func,seq1[,seq2,seq3,...]) #retorna uma lista

Exercício:Refaça o exercício de compressão de lista usando map.

Page 17: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Ferramentas funcionais - reduceFerramentas funcionais - reduce

Reduce executa uma função com dois parâmetros em uma lista, item a item.>>>soma = a,b: a+b

>>>reduce(soma,[1,2,3,4,5,6,7,8,9])

>>>#este comando executa: ((((((((1+2)+3)+4)+5)+6)+7)+8)+9)

>>>#muitas coisas poderosas podem ser geradas com isso

Exercício:Desenvolva uma função que faz a soma de uma P.A. de razão 1 até o

elemento passado como parâmetro sem ser com lambda recursivo.

Page 18: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Ferramentas funcionais - filterFerramentas funcionais - filter

Essa função filtra uma lista segundo o resultado de uma função booleana. Exemplo:>>>filter(lambda a: a>10,[2,11,5,7,23,60,10,123])

>>>filter(lambda a: a%2, [0,1,2,3,4,5,6,7,8,9])

Exercício:Limpe novamente a string (retire '#' e '\n'):>>> nome = "\n\n ## E#\n##s#t#\n\n#\na f#r\n\na###s\ne \

ti##nh##a# #s##u\n#j\ne##\n\n#i\nr##a#. \n## \n\n\n\n"

Page 19: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Ferramentas funcionais - zipFerramentas funcionais - zip

Essa função combina itens de lista um a um. Exemplos:>>>zip([1,2,3],[4,5,6])

>>>zip([1,2,3],[4,5,6],[7,8,9])

>>>zip([1,2,3],[4,5,6],[7,8])

Page 20: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Ferramentas funcionais - Ferramentas funcionais - enumerateenumerate

Essa função gera uma tupla (índice,item da tupla) que ajuda na manipulação de dicionários, lista, entre outros, exemplo:>>>enumerate(['a','b','c','d','f','g','h'])

<enumerate object at ref>

>>>list(enumerate(['a','b','c','d','f','g','h']))

[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'f'), (5, 'g'), (6, 'h')]

Exercício:Faça uma função que calcula a média ponderada dos itens de uma tupla

passada como parâmetro. Os pesos serão os índices. (Dica use a

função sum).

Page 21: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Ferramentas funcionais - all/anyFerramentas funcionais - all/any

A função all verifica se todos os elementos de uma tupla, lista ou primos são “verdadeiros”.>>>all([“”,'a',1,0])

>>>all([1,1,0])

>>># é mesmo que ((1 and 1) and 0)

A função any verifica se pelo menos um dos elementos da tupla ou primos é “verdadeiro”.>>>any([“”,'a',1,0])

>>>any([1,0,1])

>>>#é o mesmo que ((1 or 0) or 1)

Page 22: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

Leituras RecomendadasLeituras Recomendadas

● Tutorial Python– http://www.pythonbrasil.com.br/moin.cgi/Document

acaoPython?action=AttachFile&do=get&target=python24.pdf

● Dive Into Python– http://www.diveintopython.org/toc/index.html

● Site: PythonBrasil– http://www.pythonbrasil.com.br

Page 23: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

ReferênciasReferências

● http://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_funcional● http://www.secnetix.de/~olli/Python/list_comprehensions.hawk● http://www.amk.ca/python/writing/functional● http://www.pythonbrasil.com.br/moin.cgi/PythonFuncional#head-40d8cc782d458d699132d0b8ecd644959df6a7ea● http://www.ibm.com/developerworks/library/l-prog.html● http://www.ibm.com/developerworks/library/l-prog2.html● http://linuxgazette.net/109/pramode.html● http://www.network-theory.co.uk/docs/pytut/FunctionalProgrammingTools.html● http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html● http://rgruet.free.fr/PQR25/PQR2.5.html● http://en.wikipedia.org/wiki/Lambda_calculus

Page 24: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

DúvidasDúvidas

Algumas???

Page 25: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

http://www.cinlug-br.org

Page 26: Python III - cin.ufpe.brpjs/Funcional/workshop-python.3.pdf · Programação funcional “Programação funcional é um paradigma de programação que trata a computação como uma

21 43 5 6 7 8 9

Atribuição-Compartilhamento pela mesma licença 2.5(http://creativecommons.org/licenses/by-sa/2.5/deed.pt)

Você pode:● copiar, distribuir, exibir e executar a obra● criar obras derivadas● fazer uso comercial da obra

Sob as seguintes condições:Atribuição. Você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante.Compartilhamento pela mesma Licença. Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta.

● Para cada novo uso ou distribuição, você deve deixar claro para outros os termos da licença desta obra.

● Qualquer uma destas condições podem ser renunciadas, desde que Você obtenha permissão do autor.

Qualquer direito de uso legítimo (ou "fair use") concedido por lei, ou qualquer outro direito protegido pela legislação local, não são em hipótese alguma afetados pelo disposto acima.

Este é um sumário para leigos da Licença Jurídica(na íntegra: http://creativecommons.org/licenses/by-sa/2.5/br/legalcode).

Termo de exoneração de responsabilidade: http://creativecommons.org/licenses/disclaimer-popup?lang=pt