|
@@ -0,0 +1,117 @@ |
|
|
|
|
|
Jouons avec les fonctions |
|
|
|
|
|
========================= |
|
|
|
|
|
|
|
|
|
|
|
Introduction |
|
|
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
Reprenons ce qu'on a vu jusqu'ici. |
|
|
|
|
|
|
|
|
|
|
|
D'une part, on peut créer des variables en les assignant à une valeur:: |
|
|
|
|
|
|
|
|
|
|
|
# Création d'une variable `x` avec la valeur 4 |
|
|
|
|
|
x = 4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D'autre part, on peut définir et appeler des fonctions:: |
|
|
|
|
|
|
|
|
|
|
|
# Définition de la fonction: |
|
|
|
|
|
def dire_bonjour(nom): |
|
|
|
|
|
print("Bonjour " + nome |
|
|
|
|
|
|
|
|
|
|
|
# Appel |
|
|
|
|
|
dire_bonjour("Max") |
|
|
|
|
|
|
|
|
|
|
|
# Affiche: "Bonjour Max" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Fonctions en tant que variables |
|
|
|
|
|
------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
Il se trouve qu'en Python, on peut assigner des variables à ... des fonctions |
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
|
|
|
|
|
|
# Définition d'une fonction `dire_bonjour_en_français` |
|
|
|
|
|
def dire_bonjour_en_français(nom): |
|
|
|
|
|
print("Bonjour " + nom) |
|
|
|
|
|
|
|
|
|
|
|
# Définition d'une fonction `dire_bonjour_en_anglais` |
|
|
|
|
|
def dire_bonjour_en_anglais(nom): |
|
|
|
|
|
print("Hello " + nom) |
|
|
|
|
|
|
|
|
|
|
|
# Création d'une variable qui pointe sur la fonction française: |
|
|
|
|
|
ma_fonction_qui_dit_bonjour = dire_bonjour_en_français |
|
|
|
|
|
|
|
|
|
|
|
# Appel de la fonction: |
|
|
|
|
|
ma_fonction_qui_dit_bonjour("Max") |
|
|
|
|
|
|
|
|
|
|
|
# Affiche: Bonjour Max |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
De façon cruciale, notez que l'on n'a *pas* mis de parenthèses à droite |
|
|
|
|
|
lorsqu'on a créé la variable `ma_fonction_qui_dit_bonjour`. |
|
|
|
|
|
|
|
|
|
|
|
On peut donc dire que lorsqu'on définit une fonction avec `def()` et un corps |
|
|
|
|
|
il y a en réalité deux étapes: |
|
|
|
|
|
|
|
|
|
|
|
1. Python stocke le corps de la fonction quelque part |
|
|
|
|
|
2. Il crée une variable pointant vers ce corps |
|
|
|
|
|
|
|
|
|
|
|
En Python, il est assez fréquent d'utiliser de code tel que celui-ci, souvent avec un dictionnaire: |
|
|
|
|
|
|
|
|
|
|
|
Fonctions en tant qu'argement d'autres fonctions |
|
|
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
On a vu en début de chapitre qu'on peut créé des variables qui pointent |
|
|
|
|
|
vers des fonctions. |
|
|
|
|
|
|
|
|
|
|
|
Du coup, rien n'empêche de les passer en *argument* d'autres fonctions. |
|
|
|
|
|
|
|
|
|
|
|
Par exemple:: |
|
|
|
|
|
|
|
|
|
|
|
def appelle_deux_fois(f): |
|
|
|
|
|
f() |
|
|
|
|
|
f() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def crier(): |
|
|
|
|
|
print("Aline !") |
|
|
|
|
|
|
|
|
|
|
|
appelle_deux_fois(crier) |
|
|
|
|
|
|
|
|
|
|
|
# Affiche: |
|
|
|
|
|
# Aline ! |
|
|
|
|
|
# Aline ! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Fonctions imbriquées |
|
|
|
|
|
-------------------- |
|
|
|
|
|
|
|
|
|
|
|
On peut aussi définir une fonction dans une autre fonction:: |
|
|
|
|
|
|
|
|
|
|
|
TODO |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Fonctions retournant des fonctions |
|
|
|
|
|
---------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
Enfin, on peut retourner une fonction depuis une autre fonction:: |
|
|
|
|
|
|
|
|
|
|
|
def fabrique_fonction_qui_additionne(n): |
|
|
|
|
|
def fonction_résultat(x): |
|
|
|
|
|
return x + n |
|
|
|
|
|
return fonction_résultat |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
additionne_2 = fabrique_fonction_qui_additionne(2) |
|
|
|
|
|
y = additionne_2(5) |
|
|
|
|
|
print(y) |
|
|
|
|
|
# Affiche: 7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Un autre paradigme |
|
|
|
|
|
------------------- |
|
|
|
|
|
|
|
|
|
|
|
Le fait qu'on puisse traiter les fonctions comme n'importe quelle |
|
|
|
|
|
autre valeur (c'est-à-dire les assigner à des variables, les passer |
|
|
|
|
|
en argument et les retourner) |