SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
PROGRAMAÇÃO
FUNCIONAL EM PYTHON
Hugo Tavares
Juarez Bochi
globo.com
THE ELEMENTS OF PROGRAMMING
Primitive Expressions
Means of Combination
Means of Abstraction
PARADIGMAS
Imperativo
Lógico
Orientado a Objetos
Funcional
PYTHON É FUNCIONAL?
FIRST CLASS FUNCTION
HIGHER-ORDER FUNCTION
HIGHER-ORDER FUNCTION - SORT BY
pessoas = [{'nome': 'Adolfo', 'estado': 'MG'},
{'nome': 'Pedro', 'estado': 'RS'},
{'nome': 'Maria', 'estado': 'AC'}]
def por_estado(pessoa1, pessoa2):
return cmp(pessoa1['estado'], pessoa2['estado'])
>>> pprint.pprint(sorted(pessoas, cmp=por_estado))
[{'estado': 'AC', 'nome': 'Maria'},
{'estado': 'MG', 'nome': 'Adolfo'},
{'estado': 'RS', 'nome': 'Pedro'}]
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
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
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
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
"""
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
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
@tail_call_optimized
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
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>"
DATA ABSTRACTION
DATA ABSTRACTION
class Zero(Natural):
def __init__(self):
pass
def __repr__(self):
return "0"
def __add__(self, other):
return other
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)
DATA ABSTRACTION
>>> zero = Zero()
>>> um = zero.sucessor()
>>> dois = um.sucessor()
>>> um
0 + 1
>>> dois
0 + 1 + 1
>>> um + dois
0 + 1 + 1 + 1
STOP WRITING CLASSES
Jack Diederich, PyCon US 2012
http://pyvideo.org/video/880/stop-writing-classes
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"
LAZYNESS & GENERATORS
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
RESUMO
Código compreensível
Fácil de testar
Fácil de manter
Fácil de escalar
REFERÊNCIAS
Structure and Interpretation of Computer Programs
Functional Programming Principles in Scala
Stop Writing Classes" - PyCon US 2012
Códigos usados na palestra:
OBRIGADO!
@hltbra
@jbochi

Más contenido relacionado

La actualidad más candente

Data Analytics Project_Eun Seuk Choi (Eric)
Data Analytics Project_Eun Seuk Choi (Eric)Data Analytics Project_Eun Seuk Choi (Eric)
Data Analytics Project_Eun Seuk Choi (Eric)
Eric Choi
 

La actualidad más candente (20)

Regression and Classification with R
Regression and Classification with RRegression and Classification with R
Regression and Classification with R
 
Closures
ClosuresClosures
Closures
 
Print input-presentation
Print input-presentationPrint input-presentation
Print input-presentation
 
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
 
The Chain Rule, Part 2
The Chain Rule, Part 2The Chain Rule, Part 2
The Chain Rule, Part 2
 
Codigos
CodigosCodigos
Codigos
 
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver){tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
 
Analytics functions in mysql, oracle and hive
Analytics functions in mysql, oracle and hiveAnalytics functions in mysql, oracle and hive
Analytics functions in mysql, oracle and hive
 
하스켈 프로그래밍 입문 4
하스켈 프로그래밍 입문 4하스켈 프로그래밍 입문 4
하스켈 프로그래밍 입문 4
 
Ampersand method
Ampersand methodAmpersand method
Ampersand method
 
Simple swing programs
Simple swing programsSimple swing programs
Simple swing programs
 
하스켈 프로그래밍 입문 3
하스켈 프로그래밍 입문 3하스켈 프로그래밍 입문 3
하스켈 프로그래밍 입문 3
 
{:from => 'Java', :to => 'Ruby'}
{:from => 'Java', :to => 'Ruby'}{:from => 'Java', :to => 'Ruby'}
{:from => 'Java', :to => 'Ruby'}
 
Elixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicitElixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicit
 
The Chain Rule, Part 1
The Chain Rule, Part 1The Chain Rule, Part 1
The Chain Rule, Part 1
 
{tidygraph}と{ggraph}によるモダンなネットワーク分析
{tidygraph}と{ggraph}によるモダンなネットワーク分析{tidygraph}と{ggraph}によるモダンなネットワーク分析
{tidygraph}と{ggraph}によるモダンなネットワーク分析
 
Elixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicitElixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicit
 
Dwi putri erlinda saraswati
Dwi putri erlinda saraswatiDwi putri erlinda saraswati
Dwi putri erlinda saraswati
 
Data Analytics Project_Eun Seuk Choi (Eric)
Data Analytics Project_Eun Seuk Choi (Eric)Data Analytics Project_Eun Seuk Choi (Eric)
Data Analytics Project_Eun Seuk Choi (Eric)
 
The Moore-Spiegel Oscillator
The Moore-Spiegel OscillatorThe Moore-Spiegel Oscillator
The Moore-Spiegel Oscillator
 

Similar a Programação funcional em Python

Advanced python
Advanced pythonAdvanced python
Advanced python
EU Edge
 
R is a very flexible and powerful programming language, as well as a.pdf
R is a very flexible and powerful programming language, as well as a.pdfR is a very flexible and powerful programming language, as well as a.pdf
R is a very flexible and powerful programming language, as well as a.pdf
annikasarees
 

Similar a Programação funcional em Python (20)

Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
 
Optimization and Mathematical Programming in R and ROI - R Optimization Infra...
Optimization and Mathematical Programming in R and ROI - R Optimization Infra...Optimization and Mathematical Programming in R and ROI - R Optimization Infra...
Optimization and Mathematical Programming in R and ROI - R Optimization Infra...
 
Advanced python
Advanced pythonAdvanced python
Advanced python
 
Secretary_Game_With_Rejection.pdf
Secretary_Game_With_Rejection.pdfSecretary_Game_With_Rejection.pdf
Secretary_Game_With_Rejection.pdf
 
R code for data manipulation
R code for data manipulationR code for data manipulation
R code for data manipulation
 
R code for data manipulation
R code for data manipulationR code for data manipulation
R code for data manipulation
 
Vcs9
Vcs9Vcs9
Vcs9
 
Introduction to R
Introduction to RIntroduction to R
Introduction to R
 
funwithalgorithms.pptx
funwithalgorithms.pptxfunwithalgorithms.pptx
funwithalgorithms.pptx
 
R is a very flexible and powerful programming language, as well as a.pdf
R is a very flexible and powerful programming language, as well as a.pdfR is a very flexible and powerful programming language, as well as a.pdf
R is a very flexible and powerful programming language, as well as a.pdf
 
BUilt in Functions and Simple programs in R.pdf
BUilt in Functions and Simple programs in R.pdfBUilt in Functions and Simple programs in R.pdf
BUilt in Functions and Simple programs in R.pdf
 
Python 1 liners
Python 1 linersPython 1 liners
Python 1 liners
 
Functional Programming for OO Programmers (part 2)
Functional Programming for OO Programmers (part 2)Functional Programming for OO Programmers (part 2)
Functional Programming for OO Programmers (part 2)
 
Algorithm Design and Analysis - Practical File
Algorithm Design and Analysis - Practical FileAlgorithm Design and Analysis - Practical File
Algorithm Design and Analysis - Practical File
 
R meets Hadoop
R meets HadoopR meets Hadoop
R meets Hadoop
 
Recursion in C
Recursion in CRecursion in C
Recursion in C
 
Practicle 1.docx
Practicle 1.docxPracticle 1.docx
Practicle 1.docx
 
The Ring programming language version 1.10 book - Part 40 of 212
The Ring programming language version 1.10 book - Part 40 of 212The Ring programming language version 1.10 book - Part 40 of 212
The Ring programming language version 1.10 book - Part 40 of 212
 
Solucionario de Ejercicios de PL/SQL.pdf
Solucionario de Ejercicios de PL/SQL.pdfSolucionario de Ejercicios de PL/SQL.pdf
Solucionario de Ejercicios de PL/SQL.pdf
 
R/Finance 2009 Chicago
R/Finance 2009 ChicagoR/Finance 2009 Chicago
R/Finance 2009 Chicago
 

Último

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Último (20)

Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 

Programação funcional em Python

  • 1. PROGRAMAÇÃO FUNCIONAL EM PYTHON Hugo Tavares Juarez Bochi globo.com
  • 2. THE ELEMENTS OF PROGRAMMING Primitive Expressions Means of Combination Means of Abstraction
  • 6. HIGHER-ORDER FUNCTION - SORT BY pessoas = [{'nome': 'Adolfo', 'estado': 'MG'}, {'nome': 'Pedro', 'estado': 'RS'}, {'nome': 'Maria', 'estado': 'AC'}] def por_estado(pessoa1, pessoa2): return cmp(pessoa1['estado'], pessoa2['estado']) >>> pprint.pprint(sorted(pessoas, cmp=por_estado)) [{'estado': 'AC', 'nome': 'Maria'}, {'estado': 'MG', 'nome': 'Adolfo'}, {'estado': 'RS', 'nome': 'Pedro'}]
  • 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. 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.
  • 10. 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
  • 11. 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 """
  • 12. 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
  • 13. 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
  • 15. 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
  • 16. 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>"
  • 18. DATA ABSTRACTION class Zero(Natural): def __init__(self): pass def __repr__(self): return "0" def __add__(self, other): return other
  • 19. 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)
  • 20. DATA ABSTRACTION >>> zero = Zero() >>> um = zero.sucessor() >>> dois = um.sucessor() >>> um 0 + 1 >>> dois 0 + 1 + 1 >>> um + dois 0 + 1 + 1 + 1
  • 21. STOP WRITING CLASSES Jack Diederich, PyCon US 2012 http://pyvideo.org/video/880/stop-writing-classes
  • 22. 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"
  • 24. 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
  • 25. RESUMO Código compreensível Fácil de testar Fácil de manter Fácil de escalar
  • 26. REFERÊNCIAS Structure and Interpretation of Computer Programs Functional Programming Principles in Scala Stop Writing Classes" - PyCon US 2012 Códigos usados na palestra: