27
+ = f(x) Python Functional Programming

Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

  • Upload
    others

  • View
    139

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

+ =f(x)Python Functional Programming

Page 2: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Functional Programming by Wikipidia:

“Functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data". In other words, functional programming promotes code with no side effects, no change of value in variables. It oposes to imperative programming, which enfatizes change of state”.

Page 3: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

What this means?

● No mutable data (no side effect).● No state (no implicit, hidden state).

Once assigned (value binding), a variable (a symbol) does not change its value.

All state is bad? No, hidden, implicit state is bad.

Functional programming do not eliminate state, it just make it visible and explicit (at least when programmers want it to be).

● Functions are pure functions in the mathematical sense: their output depend only in their inputs, there is not “environment”.

● Same result returned by functions called with the same inputs.

Page 4: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

What are the advantages?

● Cleaner code: "variables" are not modified once defined, so we don't have to follow the change of state to comprehend what a function, a, method, a class, a whole project works.

● Referential transparency: Expressions can be replaced by its values. If we call a function with the same parameters, we know for sure the output will be the same (there is no state anywhere that would change it).

There is a reason for which Einstein defined insanity as "doing the same thing over and over again and expecting different results".

Page 5: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Advantages enabled by referential transparence

● Memoization○ Cache results for previous function calls.

● Idempotence○ Same results regardless how many times you call a function.

● Modularization○ We have no state that pervades the whole code, so we build our project with

small, black boxes that we tie together, so it promotes bottom-up programming.

● Ease of debugging

○ Functions are isolated, they only depend on their input and their output, so they are very easy to debug.

Page 6: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Advantages enabled by referential transparence

● Parallelization○ Functions calls are independent.○ We can parallelize in different process/CPUs/computers/…

We can execute func1 and func2 in paralell because a won’t be modified.

result = func1(a, b) + func2(a, c)

Page 7: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Advantages enabled by referential transparence

● Concurrencea. With no shared data, concurrence gets a lot simpler:

i. No semaphores.ii. No monitors.

iii. No locks.iv. No race-conditions.v. No dead-locks.

Page 8: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Python is a multi paradigm programming language. As a Python programmer why uses functional programming in Python?

Python is not a functional language but have a lot of features that enables us to applies functional principles in the development, turning our code more elegant, concise, maintanable, easier to understand and test.

Page 9: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Don’t Update, Create - String

name = 'Geison'name = '{0} Flores'.format(name)

FIRSTNAME = 'Geison'LASTNAME = '{0} Flores'.format(FIRSTNAME)NAME = '{0} {1}'.format(FIRSTNAME, LASTNAME)

Page 10: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Don’t Update, Create - Lists

years = [2001, 2002]years.append(2003)years += [2004, 2005]years # [2001, 2002, 2003, 2004, 2005]

YEARS = [2001, 2001]ALL_YEARS = YEARS + [2003] + [2004, 2005]

Page 11: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Don’t Update, Create - Dict

ages = {'John': 30}ages['Mary'] = 28ages # {'John': 30, 'Mary': 28}

AGES = {'John': 30}ALL_AGES = dict(AGES.itens() + {'Mary': 28}.itens())

Page 12: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Higher Order Functions

Functions and methods are first-class objects in Python, so if you want to pass a function to another function, you can just treat it as any other object.

def caller(f): f()

def say_hello(name): return 'Hello {0}'.format(name)

caller(say_hello)

Page 13: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Higher Order Functions - Map

map(lambda word: word.upper(), ["milu", "rantanplan"])# result ["MILU", "RANTANPLAN"]

def add_2(n): n + 2

map(add_2, [1, 2, 3]) # result [3, 4, 5]

Page 14: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Higher Order Functions - Filter

filter(lambda word: len(word) == 4, ["milu", "rantanplan"]) # result ["MILU"]

def greater_than_10(num): return num > 10

filter(greater_than_10, range(15)) # result [11, 12, 13, 14, 15]

Page 15: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Higher Order Functions - Reduce

import operatorreduce(operator.add, [1, 2, 3, 4, 5]) # result 15

def acumullator(a, b): return len(a) + len(b)

reduce(acumullator, ["milu", "rantanplan"]) # result 14

reduce(lambda a,b: len(a) + len(b), ["milu", "rantanplan"]) # result 14

Page 16: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Higher Order Functions - Reduce

from itertools import izip

list1 = [1, 2, 3]list2 = ["a", "b", "c"]

[list(x) for x in izip(list1, list2)] # result [[1, "a"], [2, "b"], [3, "c"]]

Page 17: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Higher Order Functions - Closure

def add_x(x): def adder(y): return x + y return adder

add_5 = add_x(5)add_7 = add_x(7)

add_5(10) # result 15add_7(10) # result 17

Page 18: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Currying and Partial Functions

Higher-order functions enable Currying, which the ability to take a function that accepts n parameters and turns it into a composition of n functions each of them take 1 parameter. A direct use of currying is the Partial Functions where if you have a function that accepts n parameters then you can generate from it one of more functions with some parameter values already filled in.

from functools import partial

plus = lambda a, b: a + b # defining a function that sums 2 numbers

plus(3, 5) # result 8

# curring calling partial function by supplying the first parameters with value 1plus_one = partial(plus, 1)# I can use the new function as normalplus_one(5) # result 6

Page 19: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Eager vs Lazy Evaluation

● Eager evaluation: expressions are calculated at the moment that variables is assined, function called...

● Lazy evaluation: delays the evaluation of the expression until it is needed.○ Memory efficient: no memory used to store complete structures.○ CPU efficient: no need to calculate the complete result before returning.○ Laziness is not a requisite for FP, but it is a strategy that fits nicely on

the paradigm(Haskell).

Python uses eager evaluation (but short-circuits && or ||).

Python generators are a mechanism for lazy evaluation.

Python arrays are not lazy, use enumarators when necessary.

Page 20: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Recursion

Looping by calling a function from within itself. When you don’t have access to mutable data, recursion is used to build up and chain data construction. This is because looping is not a functional concept, as it requires variables to be passed around to store the state of the loop at a given time.

● Purely functional languages have no imperative for-loops, so they use recursion a lot.

● If every recursion created an stack, it would blow up very soon.

● Tail-call optimization (TCO) avoids creating a new stack when the last call in a recursion is the function itself.

● TCO is not implemented in Python.

● Unfortunarely following recursion style in Python has it’s own tax: Performance.

Page 21: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Solving Python Lack of TCO(Tail Call Optimization)

# The functional solution have problens with big valuesfib = lambda n: n if n < 2 else fib(n-1) + fib(n-2)

# The iterative solution using generators works perfectly with large valuesdef fibs(): a = 0 b = 1 while True: yield a a, b = b, a + b

Page 22: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

FP in OOP?

It is possible do FP in OOP? Yes it is!

● OOP is orthogonal to FP.

● Well, at least in theory, because:

○ Typical OOP tends to emphasize change of state in objects.

○ Typical OOP mixes the concepts of identity and state.

○ Mixture of data and code raises both conceptual and practical problems.

● OOP functional languages: Scala, F#, ...

Page 23: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

A Pratical Example

Exercise: "What's the sum of the first 10 natural number whose square value is divisible by 5?"

Imperative:

Functional:

n, num_elements, s = 1, 0, 0while num_elements < 10: if n**2 % 5 == 0: s += n num_elements += 1 n += 1n #275

sum(filter(lambda x: x**2 % 5 == 0, range(1, 100))[:10])

Page 24: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

The last advice

Learn at least one functional language, it will open your mind to a new paradigm becoming you a better programmer.

Some Functional Languages:

● Haskell● ML (Standard ML, Objective Caml, ...)● Scheme● Erlang● Scala● Closure● F#

Page 25: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Conclusion

● As you can tell, Python helps you write in functional style but it doesn’t force you to it.

● Writing in functional style enhances your code and makes it more self documented. Actually it will make it more thread-safe also.

● The main support for FP in Python comes from the use of list conprehension, lambdas, closures, iterators and generators, also from the modules functools and itertools.

● Python still lack an important aspect of FP: Pattern Matching and Tails Recursion.

● There should be more work on tail recursion optimization, to encourage developers to use recursion.

● Any other thoughts?

Page 26: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

References

● http://en.wikipedia.org/wiki/Functional_programming

● http://www.cse.chalmers.se/~rjmh/Papers/whyfp.pdf

● http://docs.python.org/2/howto/functional.html

● http://www.youtube.com/watch?v=Ta1bAMOMFOI

● http://clojure.org/

● http://www.defmacro.org/ramblings/fp.html

Page 27: Python Functional Programming - Jordan University of ... · Python Functional Programming Python is a multi paradigm programming language. As a Python programmer why uses functional

Python Functional Programming

Contact me

● Email:

[email protected]

● Skype

○ geisonfgf

● Facebook

○ http://www.facebook.com/geisonfgf

● Twitter

○ http://www.twitter.com/geisonfgf