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

Post on 15-Dec-2018

242 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

21 43 5 6 7 8 9

PythonPythonIIIIII

por: Rodrigo Peixotopor: Rodrigo Peixoto

RoteiroRoteiro

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

● Exercício

– Lambda calculus● Exercício

– Ferramentas funcionais de python● Exercício

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

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

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]

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)

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)

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”]

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]]

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

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

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)

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

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.

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

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.

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.

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"

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])

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

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)

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

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

DúvidasDúvidas

Algumas???

http://www.cinlug-br.org

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

top related