Complément - niveau basique¶
Pour résumer¶
La notion de programmation fonctionnelle consiste essentiellement à pouvoir manipuler les fonctions comme des objets à part entière, et à les passer en argument à d’autres fonctions, comme cela est illustré dans la vidéo.
On peut créer une fonction par l’intermédiaire de :
l’expression
lambda:, on obtient alors une fonction anonyme ;l’instruction
defet dans ce cas on peut accéder à l’objet fonction par son nom.
Pour des raisons de syntaxe surtout, on a davantage de puissance avec def.
On peut calculer la liste des résultats d’une fonction sur une liste (plus généralement un itérable) d’entrées par :
map, éventuellement combiné àfilter;une compréhension de liste, éventuellement assortie d’un
if.
Nous allons revoir les compréhensions dans la prochaine vidéo.
Complément - niveau intermédiaire¶
Pour les curieux qui ont entendu le terme de map - reduce , voici la logique derrière l’opération reduce, qui est également disponible en Python au travers du module functools.
reduce¶
La fonction reduce permet d’appliquer une opération associative à une liste d’entrées. Pour faire simple, étant donné un opérateur binaire on veut pouvoir calculer
De manière un peu moins abstraite, on suppose qu’on dispose d’une fonction binaire f qui implémente l’opérateur , et alors
reduce
En fait reduce accepte un troisième argument - qu’il faut comprendre comme l’élément neutre de l’opérateur/fonction en question - et qui est retourné lorsque la liste en entrée est vide.
Par exemple voici - encore - une autre implémentation possible de la fonction factoriel.
On utilise ici le module operator, qui fournit sous forme de fonctions la plupart des opérateurs du langage, et notamment, dans notre cas, operator.mul ; cette fonction retourne tout simplement le produit de ses deux arguments.
# la fonction reduce dans Python 3 n'est plus une built-in comme en Python 2
# elle fait partie du module functools
from functools import reduce
# la multiplication, mais sous forme de fonction et non d'opérateur
from operator import mul
def factoriel(n):
return reduce(mul, range(1, n+1), 1)
# ceci fonctionne aussi pour factoriel (0)
for i in range(5):
print(f"{i} -> {factoriel(i)}")0 -> 1
1 -> 1
2 -> 2
3 -> 6
4 -> 24
Cas fréquents de reduce¶
Par commodité, Python fournit des fonctions built-in qui correspondent en fait à des reduce fréquents, comme la somme, et les opérations min et max :
entrees = [8, 5, 12, 4, 45, 7]
print('sum', sum(entrees))
print('min', min(entrees))
print('max', max(entrees))sum 81
min 4
max 45