Définitions de fonctions

Aperçu

Questions
  • Comment créer un code plus lisible ?

  • Comment définir ses propres fonctions ?

  • Comment éviter certains copier/coller dans un programme ?

Objectifs
  • Comprendre comment définir une fonction avec def.

  • Comprendre les paramètres d’une fonction.

  • Comprendre la valeur de retour d’une fonction.

  • Distinguer la définition d’une fonction de ses appels.

Appel de fonctions et abstraction

Nous avons vu comment utiliser des fonctions existantes, telles que print, help, len (prédéfinies), log, sqrt, sin (du module math), random, randrange (du module random), creer, couleur, disque (du module qtido). Pour pouvoir utiliser certaines fonctions, il faut les importer, comme vu précédemment. Une fois cela fait, nous pouvons utiliser la fonction autant de fois que voulu. L’utilisation d’une fonction s’appelle « un appel une fonction » ou « une invocation de fonction ».

Une fonction sert généralement à simplifier l’écriture et la lecture d’un programme. Supposons que l’on a deux variables représentant les coordonnées d’un vecteur.

x = 40
y = 30

Pour calculer la longueur du vecteur (x, y) et stocker sa valeur dans une nouvelle variable, on pourrait écrire :

d = (x**2 + y**2) ** 0.5

Si on a souvent besoin, de calculer la longueur d’un vecteur (appelée aussi « norme »), on préférait, pour éviter de se répéter et pour rendre le programme plus lisible :

d = norme(x, y)

En cachant (abstrayant) les détails d’une opération ou d’un calcul compliqué, une fonction permet de simplifier l’écriture et la lecture d’un programme, et d’éviter certaines erreurs. Comme exemple, voici un extrait de programme dans lequel on suppose qu’il existe des variables x1, y1, x2, y2, contenant les coordonnées de 2 vecteurs. Deux versions sont données, avec et sans l’utilisation de la fonction norme.

# Avec la fonction norme, sans variables
if norme(x1, y1) < norme(x2, y2):
    print("x1 est plus court avec comme norme", norme(x1, y1))
elif norme(x1, y1) > norme(x2, y2):
    print("x2 est plus court avec comme norme", norme(x2, y2))
else:
    print("x1 et x2 ont la même norme", norme(x1, y1))

# Sans la fonction norme, sans variables
if (x1**2 + y1**2) ** 0.5 < (x2**2 + y2**2) ** 0.5:
    print("x1 est plus court avec comme norme", (x1**2 + y1**2) ** 0.5)
elif (x1**2 + y1**2) ** 0.5 > (x2**2 + y2**2) ** 0.5:
    print("x2 est plus court avec comme norme", (x2**2 + y2**2) ** 0.5)
else:
    print("x1 et x2 ont la même norme", (x1**2 + y1**2) ** 0.5)

Comme exemple, prenons une fonction que l’on voudrais. Il est possible de définir une fonction, par exemple une fonction norme qui prendrais deux paramètres (les coordonnées d’un vecteur) et renverrait sa norme. On aimerai pouvoir utiliser

Définition de fonction simple

La fonction norme n’existe en fait pas. Il est possible de définir cette fonction à l’aide du mot clé Python def, par exemple de la façon suivante :

def norme(x, y):
    d = x**2 + y**2
    return d ** 0.5

C’est ce que l’on appelle une définition de fonction. En soit, cette définition ne fait rien : quand l’interpréteur Python voit cette définition, il n’exécute pas sont contenu. Une fois cette fonction définie, il est par contre possible de l’utiliser. Le mot clé return permet de spécifier quelle valeur un appel de la fonction prendra. C’est pour cela que l’on mettra les définitions de fonction au tout début des fichiers Python (.py), juste après les imports.

Sémantique de l’appel d’une fonction

Le contenu d’une fonction est aussi appelé le « corps de la fonction » et est exécuté à chaque appel de fonction. Ainsi, le programme suivant (qui affiche la longueur du vecteur (3,4) et celle du vecteur (40, 30) :

def norme(x, y):
    d = x**2 + y**2
    return d ** 0.5
    
print(norme(3, 4))
print(norme(40, 30))

est globalement équivalent à :

appel1_x = 3
appel1_y = 4
appel1_d = appel1_x**2 + appel1_y**2
appel1 = appel1_d ** 0.5

print(appel1)

appel2_x = 40
appel2_y = 30
appel2_d = appel2_x**2 + appel2_y**2
appel2 = appel2_d ** 0.5

print(appel2)

Certains points sont très importants :

L’instruction return termine la fonction

L’instruction return termine directement la fonction. Ainsi, les deux fonctions suivantes ont le même comportement :

def plus_petit1(a, b):
    if a < b:
        return a
    else:
        return b

def plus_petit2(a, b):
    if a < b:
        return a  # ce "return" quitte directement la fonction
    return b

Puisque l’instruction return a interrompt la fonction, l’instruction return b ne sera exécuté que si a n’est pas plus petit que b.

Syntaxe : Définition de fonction

  • Une définition de fonction démarre par le mot clé def (définir) suivi d’un nom de fonction, d’une suite de paramètres entre parenthèses, de : et finalement d’un bloc appelé aussi « corps de la fonction ».
  • Chaque paramètres est un nom de variable.
  • La définition de la fonction ne fait rien en soit, le corps de la fonction n’est appelé que lorsqu’on appelle la fonction.
def «nom»(«var1», «var2», ...):
    «instruction»
    «instruction»
    «…»
    
«…» # suite du programme, au même niveau que le `def`

Points Clés

  • Une fonction peut être définie à l’aide de def.

  • Une fonction a un nombre arbitraire de paramètres.

  • Une fonction retourne toujours une valeur.

  • L’instruction return permet d’interrompre la fonction et de renvoyer une valeur.

  • La valeur spéciale None représente l’absence de valeur (de retour).