0
Upcoming SlideShare
×

# Programação funcional em Python

465

Published on

Programação Funcional em Python

Apresentada na Python Brasil 2012 com Hugo Lopes Tavares

Published in: Technology, Education
1 Like
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
• Be the first to comment

Views
Total Views
465
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
11
0
Likes
1
Embeds 0
No embeds

No notes for slide

### Transcript of "Programação funcional em Python"

1. 1. PROGRAMAÇÃO FUNCIONAL EM PYTHON Hugo Tavares Juarez Bochi globo.com
2. 2. THE ELEMENTS OF PROGRAMMING Primitive Expressions Means of Combination Means of Abstraction
4. 4. PYTHON É FUNCIONAL?
5. 5. FIRST CLASS FUNCTION HIGHER-ORDER FUNCTION
7. 7. HIGHER-ORDER FUNCTION - DECORATOR def memoize(fn): cache = {} def newfn(arg): if arg in cache: return cache[arg] else: cache[arg] = fn(arg) return cache[arg] return newfn
8. 8. APLICAÇÃO DECORATOR def fib(n): if n in (1, 2): return 1 return fib(n - 1) + fib(n - 2) def fast_fib(n): if n in (1, 2): return 1 return fast_fib(n - 1) + fast_fib(n - 2) fast_fib = memoize(fast_fib) if __name__ == '__main__': print(timeit.timeit("import fib; fib.fib(35)", number=1)) print(timeit.timeit("import fib; fib.fast_fib(35)", number=1)) # 3.71057915688 # 0.000109195709229
9. 9. RECURSÃO - MOEDAS def troco(n, moedas): if n == 0: return 1 elif n < 0 or len(moedas) == 0: return 0 else: return troco(n, moedas[1:]) + troco(n - moedas[0], moedas) >>> troco(3, [1, 2]) 2 >>> troco(100, [50, 7]) 1 >>> troco(10, [50, 10, 5, 1, .50, .25, .10, .5, .1]) 1153
10. 10. RECURSÃO - FATORIAL def fat(n): if n == 0: return 1 else: return n * fat(n - 1) """ fat(5) 5 * fat(4) 5 * (4 * fat(3)) 5 * (4 * (3 * fat(2))) 5 * (4 * (3 * (2 * fat(1))) 5 * (4 * (3 * (2 * (1 * fat(0))) 5 * (4 * (3 * (2 * (1 * 1)) 5 * (4 * (3 * (2 * 1)) 5 * (4 * (3 * 2)) 5 * (4 * 6) 5 * 24 120 """
11. 11. TAIL RECURSION def fat(n, acc=1): if n == 0: return acc else: return fat(n - 1, acc * n) """ fat(5, 1) fat(4, 5) fat(3, 20) fat(2, 60) fat(1, 120) fat(0, 120) 120 """ >>> fat(1000) File "", line 5, in fat ... RuntimeError: maximum recursion depth exceeded
12. 12. TAIL RECURSION OPTIMIZATION from optimization import tail_call_optimized @tail_call_optimized def fat(n, acc=1): if n <= 1: return acc else: return fat(n - 1, acc * n) >>> fat(1000) 402387260077093773543702433923003985719374864210714632543799910429 938512398629020592044208486969404800479988610197196058631666872994 808558901323829669944590997424504087073759918823627727188732519779 505950995276120874975462497043601418278094646496291056393887437886 487337119181045825783647849977012476632889835955735432513185323958 463075557409114262417474349347553428646576611667797396668820291207 379143853719588249808126867838374559731746136085379534524221586593 201928090878297308431392844403281231558611036976801357304216168747 609675871348312025478589320767169132448426236131412508780208000261 683151027341827977704784635868170164365024153691398281264810213092 761244896359928705114964975419909342221566832572080821333186116811 553615836546984046708975602900950537616475847728421889679646244945 160765353408198901385442487984959953319101723355556602139450399736 280750137837615307127761926849034352625200015888535147331611702103 968175921510907788019393178114194545257223865541461062892187960223
13. 13. @tail_call_optimized
14. 14. CURRYING def somador(a): def soma(b): return a + b return soma >>> somador(1) <function soma at 0x100499f50> >>> somador(1)(2) 3 >>> incr = somador(1) >>> incr(2) 3 >>> incr(3) 4
15. 15. CURRYING & PARTIALS def partial(funcao, argumento): def fn(arg): return funcao(argumento, arg) return fn def to_tag(tag, texto): return "<{tag}>{texto}</{tag}>".format(tag=tag, texto=texto) negrito = partial(to_tag, 'b') italico = partial(to_tag, 'i') >>> negrito(italico("oi, python brasil")) "<b><i>oi, python brasil</i></b>"
16. 16. DATA ABSTRACTION
17. 17. DATA ABSTRACTION class Zero(Natural): def __init__(self): pass def __repr__(self): return "0" def __add__(self, other): return other
18. 18. DATA ABSTRACTION class Natural(object): def __init__(self, anterior): self.anterior = anterior def __repr__(self): return repr(self.anterior) + " + 1" def __add__(self, other): return self.anterior + other.sucessor() def sucessor(self): return Natural(anterior=self)
19. 19. DATA ABSTRACTION >>> zero = Zero() >>> um = zero.sucessor() >>> dois = um.sucessor() >>> um 0 + 1 >>> dois 0 + 1 + 1 >>> um + dois 0 + 1 + 1 + 1
20. 20. STOP WRITING CLASSES Jack Diederich, PyCon US 2012 http://pyvideo.org/video/880/stop-writing-classes
21. 21. STOP WRITING CLASSES class Greeting(object): def __init__(self, greeting="hello"): self.greeting = greeting def greet(self, name): return "{greet}! {name}".format(greet=self.greeting, name) >>> hola = Greeting("hola") >>> hola.greet("bob") "hola! bob"
22. 22. LAZYNESS & GENERATORS
23. 23. LAZYNESS & GENERATORS def naturais(): i = 0 while True: yield i i += 1 def pares(): return ifilter(lambda x: x % 2 == 0, naturais()) >>> sum(take(pares(), 10)) 90
24. 24. RESUMO Código compreensível Fácil de testar Fácil de manter Fácil de escalar
25. 25. REFERÊNCIAS Structure and Interpretation of Computer Programs Functional Programming Principles in Scala Stop Writing Classes" - PyCon US 2012 Códigos usados na palestra: