Le paradigme de programmation fonctionnelle se caractérise essentiellement par l'absence d'effets de bord.
Pour cela, le code défini à l'intérieur d'une fonction :
a = 0 def augmenter(): global a a = a + 1
Explications :
def increment(a): return a + 1
Explications :
La programmation fonctionnelle est particulièrement intéressant pour intervenir sur des listes. Les exemple qui suivent s'appuie sur la liste de Todos suivantes :
taches = [{"id":"1","libelle":"Préparer mon sac", "accomplie":True}, {"id":"2","libelle":"Prendre mon petit-déjeuner", "accomplie":False}, {"id":"3","libelle":"Partir au lycée", "accomplie":False}]
Voici l'utilisation de la fonction map pour avoir une nouvelle liste tachesfinies avec toutes les tâches finies :
# definition de la fonction qui met la valeur True pour la donnée acccomplie def fini(tache): return {"id":tache["id"],"libelle":tache["libelle"], "accomplie":False} #nouvelle liste avec toutes taches accomplies tachesfinies = list(map(fini,taches))
Il est possible d'utiliser une fonction anonyme lambda directement dans la fonction map :
# utilisation d'une fonction anonyme lambda #nouvelle liste avec toutes taches accomplies tachesfinies = list(map(lambda tache: {"id":tache["id"],"libelle":tache["libelle"], "accomplie":False}, taches))
Les fonctions lambda sont des fonctions anonymes, c'est à dire des fonctions qui n'ont pas de nom. Une fonction anonyme :
Une fonction anonyme peut être placée :
Exemple avec une variable :
# definition de la fonction anonyme et affectation dans la variable fois2 fois2 = lambda x: x * 2 #utilisation >>> print(fois2(4)) >>> 8
Même résultat avec un générateur :
#nouvelle liste avec les taches modifiées pour les indiquer accomplies (finies) tachesfinies = [fini(tache) for tache in taches]
Voici l'utilisation de la fonction filter pour avoir une nouvelle liste tachesfinies qui ne contient que les tâches finies :
# definition de la fonction qui teste la valeur True pour la donnée acccomplie def fini(tache): return tache["accomplie"] == True #nouvelle liste avec uniquement les taches accomplies (finies) tachesfinies = list(filter(fini,taches))
Même résultat avec une fonction anonyme :
#nouvelle liste avec uniquement les taches accomplies (finies) tachesfinies = list(filter(lambda tache:tache["accomplie"] == True, taches))
Même résultat avec un générateur :
#nouvelle liste avec uniquement les taches accomplies (finies) tachesfinies = [tache for tache in taches if tache["accomplie"] == True]
La fonction reduce prend en entrée une fonction et une collection d'éléments. Elle renvoie une valeur créée en combinant les éléments de la collection. Exemple qui calcule la somme des éléments d'un tableau
# importation de la fonction reduce from functools import reduce tableau = [0, 1, 2, 3, 4] somme = reduce(lambda a, x: a + x, tableau) # somme contient 10
Explications :
somme = reduce(lambda a, x: a + x, tableau, 50)
taches.sort(key=lambda tache: tache["id"], reverse=True)