Vous êtes sur la page 1sur 18

La Programmation Fonctionnelle

(Functional Programming)

1
La Programmation Fonctionnelle ( Functional Programming)

Le paradigme de programmation fonctionnelle traite le déroulement du programme comme une évaluation


des fonctions.
La sortie de chaque fonction ne dépend que de ses valeurs d'argument en entrée. Par conséquent, l'appel
de la même fonction deux fois doit toujours renvoyer la même valeur.
C'est basé sur la programmation déclarative, dans le sens d'utiliser des expressions plutôt que des
instructions.
En programmation fonctionnelle, le programme est composé par des fonctions courtes. Tout le code est
dans une fonction. Toutes les variables sont définies pour la fonction. De plus, au sein d'une fonction,
vous ne pouvez modifier aucune variable.
Haskell est un bon exemple de langage de programmation fonctionnel.
La première implémentation de Perl 6 (Pugs) a été écrite en Haskell.

A
Par
def add(x, y):

OMRANI M.
sum = 0
for x in L: 🡺 return x + y
sum += x sum = reduce(add, L)

2
La Programmation Fonctionnelle ( Functional Programming)

Regardons plus en profondeur ce que cela signifie:


Élimination des effets secondaires: Bien que dans la programmation impérative, des effets secondaires
(sur les états des objets) étaient souhaités lors de l'exécution du programme. En programmation
fonctionnelle, c'est exactement le contraire. Chaque fonction est supposée être un bloc de construction
individuel dont la valeur de retour est basée uniquement sur ses valeurs d'entrée.

Notez que, dans la programmation fonctionnelle, il est presque impossible de définir une fonction qui ne
prend aucun argument et ne renvoie aucune valeur.
Ceci contraste avec la programmation impérative, où l'utilisation de telles fonctions est logique car elles
peuvent modifier certains états internes (d'un objet par exemple).

A
Par
OMRANI M.
3
La Programmation Fonctionnelle ( Functional Programming)

Bonne Pratique: Functional programming in PHP


Éliminer les effets secondaires
C'est surtout une question de style de programmation. Bien sûr, PHP ne nous empêche pas de violer cette règle. Notez
que, par effets secondaires, nous entendons également les cas d'utilisation comme suit:

function sum($array) {
Même si nous n'avons pas défini la fonction saveToDatabase
$sum = 0;
() (par exemple, elle provient d'un framework que nous
foreach ($array as $value) {
utilisons), cela reste un effet secondaire.
$sum += $value;
Si nous exécutons à nouveau la même fonction, elle
}
retournera la même valeur, mais l'état final est différent. Par
saveToDatabase($sum);
exemple, il créera deux fois l'enregistrement dans la base de
return $sum;
données.
}
sum([5, 1, 3, 7, 9]);

A
Par
OMRANI M.
4
La Programmation Fonctionnelle ( Functional Programming)

Regardons plus en profondeur ce que cela signifie:


Eviter les données mutables:
Le concept de ne pas modifier la valeur d'entrée et de travailler avec leurs copies fonctionne bien sans créer d'effets
secondaires.
L'exécution de la même fonction avec les mêmes paramètres d'entrée renverra toujours la même valeur.
Habituellement, cela inclut:
Il peut être passé en paramètre aux fonctions,
Il peut être retourné d'une fonction
Il peut être assigné à une variable.

A
Par
OMRANI M.
5
La Programmation Fonctionnelle ( Functional Programming)
Bonne Pratique: Functional programming in PHP
Eviter les données mutables
Ce concept est simple avec des types de données primitifs, par exemple:

function add($first, $second) {


return $first + $second;
}
add(5, 2);

Cependant, en travaillant avec des collections, ce principe nécessite la création d’un nouvelle collection et copie des
valeurs de l'ancienne collection au nouveau:
Ce concept de collections immuables (ou objets en général) est devenu très
populaire en JavaScript avec des bibliothèques telles que Immutable.js, faites par
function greaterThan($collection, $threshold) { Facebook (https://facebook.github.io/immutable-js/), ou le mécanisme de détection
$out = []; des modifications onPush dans Angular2.
foreach ($collection as $val) { En plus de rendre notre code plus prévisible, lorsqu'il est utilisé de manière appropriée,
if ($val > $threshold) { il simplifiera la vérification des modifications dans les grandes collections car, si l'un de
$out[] = $val; ses éléments a changé, la collection entière est remplacée par une nouvelle instance.

} En PHP, il existe déjà des bibliothèques qui facilitent cette tâche, par exemple
} Immutable.php (https://github.com/jkoudys/immutable.php). Par exemple, PHP 5.5+
est livré avec une version immuable de la classe DateTime appelée DateTimeImmutable
return $out;
par défaut.
}
greaterThan([5, 12, 8, 9, 42], 8);
// will return: [12, 9, 42] 6
La Programmation Fonctionnelle
(Functional Programming)
Travaux Pratiques (Python)

7
Python est un langage de programmation
objet interprété, multi-paradigme et
multiplateformes.

A
Par
OMRANI M.
8
>>>
La Programmation Fonctionnelle ( Functional Programming)

Bonne Pratique: Functional programming in Python

1) Assigner une fonction à une variable : 3) Implémentation de la fonction map  :


>>> liste = [1,2,3,4,5]
>>> def x2(n): >>> result2 = []
... return n*2 >>> for elt in liste:
... ... result2.append(elt * 2)
...
>>> ma_fonction = x2 >>> result2
>>> ma_fonction(4) Resultat ??
Resultat ??
4) calcule la somme de tous les éléments d'une liste :
2. Passer une fonction en argument d'une autre fonction : >>> def somme(liste):
>>> def applique(fn, arg): ... accumulateur = 0
... print("application de la fonction") ... for elt in liste:
... return fn(arg) ... accumulateur = accumulateur + elt
... ... return accumulateur
>>> applique(, 4) ...
application dx2e la fonction >>> maliste = [1,2,3,4,5]
Resultat ?? >>> somme(maliste)
Resultat ??

A
Par
OMRANI M.
9
>>>
La Programmation Fonctionnelle ( Functional Programming)

Bonne Pratique: Functional programming in Python

1) Assigner une fonction à une variable : 3) Implémentation de la fonction map  :


>>> liste = [1,2,3,4,5]
>>> def x2(n): >>> result2 = []
... return n*2 >>> for elt in liste:
... result2.append(elt * 2)
...
...
>>> ma_fonction = x2 >>> result2
>>> ma_fonction(4) [2, 4, 6, 8, 10]
8
4) calcule la somme de tous les éléments d'une liste :
2. Passer une fonction en argument d'une autre fonction : >>> def somme(liste):
>>> def applique(fn, arg): ... accumulateur = 0
... print("application de la fonction") ... for elt in liste:
... return fn(arg) ... accumulateur = accumulateur + elt
... ... return accumulateur
>>> applique(x2, 4) ...
application de la fonction >>> maliste = [1,2,3,4,5]
>>> somme(maliste)
8
15

A
Par
OMRANI M.
10
La Programmation Fonctionnelle ( Functional Programming)

Bonne Pratique: Functional programming in Python


Exercice 2 : Composition de fonctions

Écrivez une fonction compose1 qui prend deux arguments (deux fonctions), et en retourne la fonction
composée. Les fonctions en argument seront donnés dans l'ordre de leur application.

A
Par
OMRANI M.
11
Exemple de la programmation fonctionnelle en Pyhton

def x2(n):
return n*2

def mymap(fonc, liste):

limap = list()

for e in liste:
limap.append(fonc(e))

return limap

liste = [1, 2, 3, 4, 5]

print(mymap(x2, liste))

A
Par
OMRANI M.
12
La Programmation Fonctionnelle ( Functional Programming)
Bonne Pratique: Functional programming in Python
Exercice 2

Programmation, récursivité On souhaite écrire une fonction récursive qui calcule la puissance xb ,
pour x, b ≥ 0.
1. Donnez une définition récursive dans un style mathématique pour cette fonction.
Rappel : voici la définition mathématique de la factorielle :

2. Ecrivez cette fonction en Python.


3. Testez votre fonction. Termine-t-elle toujours ? Pourquoi ?

A
Par
OMRANI M.
13
Présentation des fonctions lambda
>>> def f(x):
return x*2
>>> f(3) 6

>>> g = lambda x: x*2


>>> g(3) 6

>>> (lambda x: x*2)(3)


>>> 6
Voici une fonction lambda qui fait la même chose que la fonction ordinaire précédente. Notez la syntaxe condensée : il n’y
a pas de parenthèses autour de la liste d’arguments et le mot-clé return est manquant (il est implicite, la fonction complète
ne pouvant être qu’une seule expression).

A
Par
Remarquez aussi que la fonction n’a pas de nom, mais qu’elle peut être appelée à travers la variable à laquelle elle est

OMRANI M.
assignée.

Vous pouvez utiliser une fonction lambda sans l’assigner à une variable. Ce n’est pas forcément très utile, mais cela
démontre qu’une fonction lambda est simplement une fonction en ligne.
14
Notez-bien:
Reduce Map
Nous pouvons utiliser la fonction reduce pour Voici comment nous pourrions utiliser map pour ajouter
calculer la somme des éléments. 10 ou 20 à chaque élément d'une liste:

A
Par
OMRANI M.
15
La Programmation Fonctionnelle ( Functional Programming)
Bonne Pratique: Functional programming in Python
Composition de fonctions
Imaginons que nous voulions appliquer plusieurs fonctions de façon séquentielle. Par exemple : 

>>> x2 = lambda a: a * 2
>>> plus5 = lambda a: a + 5
>>> plus5(x2(3))
Resultat ???
>>> x2plus5 = lambda a: plus5(x2(a))
>>> x2plus5(3)
Resultat ???

A
Par
OMRANI M.
16
La Programmation Fonctionnelle ( Functional Programming)
Bonne Pratique: Functional programming in Python
Composition de fonctions
Imaginons que nous voulions appliquer plusieurs fonctions de façon séquentielle. Par exemple : 

>>> x2 = lambda a: a * 2
>>> plus5 = lambda a: a + 5
>>> plus5(x2(3)) # (3 * 2) + 5
11
>>> x2plus5 = lambda a: plus5(x2(a))
>>> x2plus5(3)
11

Ici, on dit que la fonction x2plus5 est la composée des fonctions x2 et plus5, c'est-à-dire qu'elle applique à son argument, successivement,
la fonction x2 puis la fonction plus5.

A
Par
OMRANI M.
17
La Programmation Fonctionnelle ( Functional Programming)
Bonne Pratique: Functional programming in Python
Exercice 3

Ecrire la Fonction Python nombres_amicaux(n) qui affiche tous les nombre amicaux inférieur ou égale à
n, n entier positif passé en paramètre.
a et b deux entiers positifs sont dits amicaux si chacun des deux nombres est égal à la somme des diviseurs
stricts de l'autre (diviseurs autres que lui-même).

Exemple: la somme des diviseurs de 220 (en excluant 220) : 1+2+4+5+10+11+20+22+44+55+110=284


la somme des diviseurs de 284(en excluant 284) : 1+2+4+71+142=220.

A
Par
OMRANI M.
18

Vous aimerez peut-être aussi