Module 5
Mondher Bouden
2024-2025
Les fonctions (i.e. Procédures)
La décomposition fonctionnelle
• Objectif : Permet surtout de réutiliser le code, mais c’est
également une bonne façon de concevoir des solutions d’une
manière progressive.
• On voit une fonction comme une boîte noire.
La décomposition fonctionnelle
• Par exemple : on doit déterminer si des nombres
sont premiers.
– 𝑛 est premier s'il n'a comme diviseurs que 1 et lui-même, 𝑛.
– Sans plus d'information, on utilise une fonction premier(n), en
supposant que la valeur retournée par celle-ci sera une valeur
booléenne.
La fonction premier(n)
• 𝑛 est premier s'il n'a comme diviseurs que 1 et lui-même
• 𝑛 n'est pas premier s'il a d'autres diviseurs, compris entre 2 et 𝑛 −
1
• Si n % i == 0, alors 𝑛 se divise exactement par 𝑖.
• On veut faire abstraction de ce détail dans notre code, tout en le
rendant plus facile à lire. On va donc créer une fonction
diviseur(a, b) retournant un Booléen, tel que:
▶ diviseur(a, b) == True si a % b == 0
▶ diviseur(a, b) == False autrement
• On peut utiliser diviseur(a, b) dans notre code de la fonction
premier(n), sans élaborer diviseur(a, b).
• Les noms de variables dans la définition d'une fonction sont
appelés paramètres.
La fonction diviseur(arg, arg)
• diviseur(a, b) retourne True si b est un diviseur de a.
• La position des valeurs à l'appel de la fonction est importante.
▶ diviseur(12, 4) n'est pas la même chose que diviseur(4, 12).
La fonction premier(n)
• 𝑛 est premier s'il n'a comme diviseurs que 1 et lui-même
• 𝑛 n'est pas premier s'il a d'autres diviseurs, compris entre 2 et 𝑛 − 1
• La fonction diviseur(a, b) retourne True si b est un diviseur de a, et
False sinon.
La fonction premier(n)
• 𝑛 est premier s'il n'a comme diviseurs que 1 et lui-même
• 𝑛 n'est pas premier s'il a d'autres diviseurs, compris entre 2 et 𝑛 − 1
• La fonction diviseur(a, b) retourne True si b est un diviseur de a, et
False sinon.
La fonction premier(n)
• Lorsqu‘on vérifie le contenu d'une variable Booléenne dans une
expression conditionnelle, on peut omettre le == True
Déclaration d'une fonction en Python
• Lorsqu'un vérifie le contenu d'une variable Booléenne dans une
expression conditionnelle, on peut omettre le == True
Utilisation d'une fonction en Python
La fonction diviseur(a, b)
• b est un diviseur de a si le reste de la division de a par b est 0
• Si a % b == 0, alors b est un diviseur de a
• La fonction diviseur(a, b) retourne True si b est un diviseur de a, et
False autrement.
La fonction diviseur(a, b)
• b est un diviseur de a si le reste de la division de a par b est 0
• Si a % b == 0, alors b est un diviseur de a
• La fonction diviseur(a, b) retourne True si b est un diviseur de a, et
False autrement.
La fonction diviseur(a, b)
• b est un diviseur de a si le reste de la division de a par b est 0
• Si a % b == 0, alors b est un diviseur de a
• La fonction diviseur(a, b) retourne True si b est un diviseur de a, et
False autrement.
La fonction diviseur(a, b)
• b est un diviseur de a si le reste de la division de a par b est 0
• Si a % b == 0, alors b est un diviseur de a
• La fonction diviseur(a, b) retourne True si b est un diviseur de a, et
False autrement.
Les fonctions premier(n) et diviseur(a,b)
L’ordre de ce code
est important !
Le passage de valeurs par paramètres
• diviseur(12, 4)
• diviseur(3 * 4, 2**2)
• diviseur(abs(-12), 3 + 1)
• Appel : nom_de_fonction(expr1, expr2 ,...)
• Les expressions sont d'abord évaluées, puis les valeurs
sont passés en arguments à la fonction.
Le passage de valeurs par paramètres
• Lors de l'appel de diviseur(12, 4), les valeurs 12 et 4 sont
les arguments avec lesquels on appelle la fonction. Les
paramètres a et b prendront les valeurs des arguments
pendant l'exécution du code de la fonction.
La valeur de retour d’une fonction
• Une ≪ vraie ≫ fonction (au sens strict)
doit renvoyer une valeur lorsqu’elle se
termine en utilisant return.
• return peut également être utilisé sans
aucun argument pour provoquer la
fermeture immédiate de la fonction.
• Une fonction qui ne retourne rien est
une procédure. En fait, la valeur
retournée est l’objet None (comme le
void en C++) qui est de type
NoneType .
• Dans certains langages de
programmation, les fonctions et les
procédures sont définies a l’aide
d’instructions différentes. Python utilise
la même instruction def pour définir les
unes et les autres.
Le retour de plus d'une valeur
• Il peut parfois être pratique de définir une fonction qui
retourne plusieurs valeurs.
• Fonction carre_et_cube(x), qui retourne x**2 et x**3
• Façon d'utiliser la fonction : a, b = carre_et_cube(4)
• Utiliser ensuite les variables a et b dans des expressions.
Le retour de plus d'une valeur
Attention au passage d'arguments
• Le passage d'une valeur en argument à une fonction copie la donnée
reçu dans la variable locale (le paramètre) de la fonction.
• Par exemple, lors de l'appel carre_et_cube(3 * 2 - 1), la valeur 5 est
copiée dans la variable x de la fonction.
• Certaines données sont trop volumineuses pour procéder ainsi, par
exemple : les listes.
• Alors, elle ne seront pas copiées, et la fonction travaillera sur l'espace
mémoire original.
• Si on modifie la liste dans la fonction, la liste originale sera également
modifiée.
Variables locales vs variables globales
• La variable a définie dans la fonction
modifier() est une variable locale
appartenant à l’espace de noms (name
space) de cette fonction.
• Ces variables a et b sont des variables
globales que la fonction modifier()
peut consulter, mais ne peut pas
changer.
• Pour qu’une fonction puisse modifier
une variable globale, il faut utiliser le
terme « global ».
• La fonction incrementer() peut
maintenant modifier la variable
globale x.
Importation de modules
• Nous pouvons importer des modules externes ou créer et
importer nos propres modules.
– Exemple: Le module math contient des fonctions mathématiques
telles que sinus, cosinus, tangente, racine carrée, etc.
Le symbole ≪ joker ≫ * permet d’inclure toutes les fonctions
du module math, mais il est conseillé de n’inclure que les
fonctions dont nous avons besoin.
Importation de modules
• Il est conseiller de placer vos définitions de fonctions dans un
module Python, et le programme qui les utilise dans un autre.
Fonction main()
• Python n’a pas vraiment une fonction main() comme C++, ou Java.
• On utilise : « if __name__ == '__main__': » afin de déterminer si le script est
lancé en tant qu’une application principale (dans ce cas, les instructions qui
suivent doivent être exécutées), ou au contraire utilisé comme un fichier importé
ailleurs (dans ce cas, cette partie du code n’est pas exécutée, mais qui sert à faire
des tests).
• La variable __name__ (automatiquement créée par Python) contient le nom du
script courant si on importe le script et elle contient la chaîne __main__ s’il s'agit
du script principal.
Fonction main()
Exemple 1: Copie d’une liste
Exemple 2: Fibonacci récursive
Danger d’une solution récursive
Soit les appels effectués pour Fibonacci (n) :
Fibonacci (n)
Fibonacci (n-2) Fibonacci (n-1)
Fibonacci (n-3) Fibonacci (n-2)
Fibonacci (n-4)
Fibonacci (n-3)
Fibonacci (n-4)
Fibonacci (n-6) Fibonacci (n-5)
Fibonacci (n-3)
Règle: Ne jamais dupliquer le travail par des appels récursifs différents.
Exemple 3: Fibonacci récursive efficace
Exemple 4: Fonction premier() plus efficace