---
maxWidth: 600
---
# La programmation \\ fonctionnelle
## Histoire
### Née avec le langage LISP \\ en 1958 (John Mc Carthy)
### Basée sur le *lambda-calcul* d'Alonzo Church
## Les principes
### Paradigme de programmation
### Notion centrale : ==fonction==
### La ==composition== remplace la séquence
### La ==récursion== remplace l'itération
### ⛔ Pas de variables, boucles, instructions conditionnelles
## Notation `lambda`
### Permet de définir (en Python) \\une fonction
#### souvent *anonyme* : `lambda x: 2*x`
#### mais on peut aussi la nommer : `double = lambda x: 2*x`
## Les fonctions \\ d'ordre supérieur
### ✒️ Fonction qui prend une ou plusieurs fonctions en paramètre et/ou qui renvoie une fonction
### `sorted` : le paramètre `key` est une fonction
#### 🐍 Exemple : tri selon le deuxième élément de chaque tuple \\`<<< sorted([(1, 5), (2, 1), (3, 2)], key=lambda t: t[1])`\\ `[(2, 1), (3, 2), (1, 5)]`
### `map` : pour appliquer une fonction à tous les éléments d'une liste
#### 🐍 Exemple : calcul des doubles\\`<<< list(map(lambda x: 2*x, [1, 2, 3]))` \\`[2, 4, 6]`
### `filter` : pour tester un prédicat sur tous les éléments d'une liste
#### 🐍 Exemple : nombres pairs compris entre 0 et 5 \\`<<< list(filter(lambda x: x%2 == 0, range(6)))`\\ `[0, 2, 4]`
### `reduce` : pour appliquer une fonction aux éléments d'une liste, \\deux à deux de façon cumulative
##### 🐍 Exemple : somme des entiers de 1 à 5 \\ `reduce(lambda x, y: x + y, range(1, 6))`
## Transparence référentielle
### ✒️ Si on applique une fonction aux mêmes arguments, on obtient à chaque fois le même résultat
### ❌ Pas d'objets mutables pour éviter les effets de bord \\ `lst.append(e)`
### ✅ Créer des nouveaux objets à la place \\`lst = lst + [e]`