Pourquoi faire des fonctions ?

Don't repeat yourself

L'un des grands principes de la programmation, c'est le fait de ne pas se répéter inutilement. Ce principe en anglais est explicité par l'acronyme DRY (don't repeat yoursel). Et l'un des outils pour cela est celui des fonctions.

Première version

Imaginons le problème suivant : je souhaite calculer la somme des nombres entiers de 1 à 10. Pn peut réaliser le calcul de la façon suivante :

resultat = 0
nombre = 1
while nombre <= 10 :
    resultat += nombre
    nombre += 1

print ("la somme des nombres de 1 à 10 est : ", resultat)

On se répète un peu...

Imaginons maintenant que l'on souhaite faire aussi la somme des entiers de 12 à 24. L'approche la plus courante chez les programmeurs débutants est de faire un copier-coller du code précédent en remplaçant 1 par 12 et 10 par 24. Le code est alors redondant

resultat = 0
nombre = 1
while nombre <= 10 :
    resultat += nombre
    nombre += 1

print ("la somme des nombres de 1 à 10 est : ", resultat)

resultat = 0
nombre = 12
while nombre <= 24 :
    resultat += nombre
    nombre += 1

print ("la somme des nombres de 12 à 24 est : ", resultat)

On se répète encore ?

Imaginons maintenant que l'on souhaite en plus faire la somme des entiers de 1 à 15. Si on répète le code ci dessus, cela devient un peu lourd ...

resultat = 0
nombre = 1
while nombre <= 10 :
    resultat += nombre
    nombre += 1

print ("la somme des nombres de 1 à 10 est : ", resultat)

resultat = 0
nombre = 12
while nombre <= 24 :
    resultat += nombre
    nombre += 1

print ("la somme des nombres de 12 à 24 est : ", resultat)

resultat = 0
nombre = 1
while nombre <= 15 :
    resultat += nombre
    nombre += 1

print ("la somme des nombres de 1 à 15 est : ", resultat)

La notion de fonction

Le bloc qui nous permet de faire le calcul de la somme des nombres est toujours le même. Pour ne pas se répéter, nous allons rendre cette partie du code unique et réutilisable grâce aux fonctions.

Définir une fonction

Une fonction en python est un bout de code réutilisable, qui permet d'effectuer des opérations qui peuvent dépendre de paramètres. En ce sens, elles ressemblent beaucoup aux fonctions vues au lycée en mathématiques.

Pour créer notre fonction, nous utilisons le mot clef def suivi du nom de la fonction. Viennent ensuite des parenthèses et à l'intérieur de ces parenthèses les éventuels paramètres que nous utiliserons. Enfin, au bout de la ligne, il y a un : qui indique que ce qui vient après est le code qui sera exécuté.

def somme_entiers(debut,fin) :

Les instructions qui seront exécutées lorsque la fonction est appelée sont décalées. En Python, c'est ce décalage (l'indentation) qui indique la structure du programme. Ici, nous mettons le code commun

def somme_entiers(debut,fin) :
    resultat  = 0
    nombre = debut
    while nombre <= fin :
        resultat += nombre
        nombre += 1

Notre fonction, lorsqu'elle est appelée, effectue le calcul. Mais ensuite ? Pour l'instant, le résultat est perdu dans la nature... Nous allons le retourner au programme principal qui a appelé la fonction grâce au mot clef return

def somme_entiers(debut,fin) :
    resultat  = 0
    nombre = debut
    while nombre <= fin :
        resultat += nombre
        nombre += 1
    return resultat

Utiliser la fonction

Vous avez essayé le programme précédent ? Il ne se passe rien ? C'est normal. Nous avons défini la fonction, c'est à dire une suite d'action à effectuer. Mais nous n'avons pas utilisé cette fonction. Pour avoir l'équivalent de notre code précédent, il faudra appeler 3 fois cette fonction:

def somme_entiers(debut,fin) :
    resultat  = 0
    nombre = debut
    while nombre <= fin :
        resultat += nombre
        nombre += 1
    return resultat

s = somme_entiers(1,10)
print("La somme des entiers de 1 à 10 est : ", s)

s = somme_entiers(12,24)
print("La somme des entiers de 12 à 24 est : ", s)

s = somme_entiers(1,15)
print("La somme des entiers de 1 à 15 est : ", s)

Paramètres indéterminés

Mieux encore, les paramètres peuvent ne pas être déterminés à l'avance. Le code ci dessous va demander le nombre de début et le nombre de fin à l'utilisateur, et lui affiche la somme des entiers entre ces deux nombres. Puis le programme recommencera tant que l'utilisateur lui demandera

def somme_entiers(debut,fin) :
    resultat  = 0
    nombre = debut
    while nombre <= fin :
        resultat += nombre
        nombre += 1
    return resultat
    
reponse = "o"
while reponse == "o":
    a = int(input("Quel est le premier nombre ? "))
    b = int(input("quel est le dernier nombre ? "))
    print("la somme des entiers de ",a," à ",b," est ",somme_entiers(a,b))
    reponse = input("Voulez vous continuer (o pour continuer)? ")

Exercices

À faire

Vous allez réaliser une fonction qui s'appelle surface_rectangle, qui prend en paramètres deux nombres positifs qui représentent la longueur et la largeur d'un rectangle et qui retourne la surface du rectangle

À faire

Vous allez réaliser une fonction qui s'appelle motif_etoile qui prendra en entrée un nombre entier n et qui renverra la chaine qui contient n fois le symbole * si n est pair, et n fois le symbole + si n est impair.

Par exemple, si on appelle motif_etoile(2),la chaine de caractère retournée sera "**". Et motif_etoile(5),la chaine de caractère retournée sera "+++++"

La fonction sera appelée avec une boucle prédéfinie pour dessiner un motif

En résumé

À retenir
  • Une fonction est un bloc de code python
  • introduit par le mot clef def
  • qui porte un nom
  • qui peut avoir des paramètres
  • qui peut renvoyer une valeur
def somme_entiers(debut,fin) :
    resultat  = 0
    nombre = debut
    while nombre <= fin :
        resultat += nombre
        nombre += 1
    return resultat