Les fonctions

Vos scripts commencent désormais à compter un nombre plus important de lignes de code mettant en jeu plusieurs tâches distinctes. Il peut être intéressant d'identifier certaines de ces tâches de manière explicite. Pour cela, nous allons créer des fonctions.

Une fonction est un bloc d'instructions, identifié par un nom spécifique choisi par le programmateur (c'est à dire vous).

Ce bloc d'instructions effectue une tâche bien précise, qui peut avoir besoin qu'on lui donne préalablement la valeur d'un ou de plusieurs paramètres (ou encore arguments)

Les exemples suivants illustrent plus clairement ce qu'est une fonction:

exemple 1

Dans l'exemple 1, on a simplement réorganisé les différents éléments d'un exercice précédent

On définit une fonction appelée 'prixdelaplace' qui renvoie le prix de la place de cinéma en fonction de l'âge du spectateur. Le paramètre d'entrée est l’âge, indiqué entre parenthèses à la ligne 1. La valeur retournée par la fonction est un prix qui dépend de la valeur de l’âge. Cette valeur est renvoyée grâce à l'instruction 'return' (lignes 3, 5, 7 et 9)

Lorsque l'interpréteur parcourt les lignes 1 à 9, il n'exécute rien: il se contente de prendre connaissance de la définition de cette fonction. Ce n'est qu'à la ligne 16 du script que la fonction est réellement exécutée

Le programme "principal" ne commence qu'à la ligne 11 et le fait d'en avoir extrait le calcul du prix d'une place en fonction de l’âge du spectateur rend sa lecture plus simple.

exemple 2

Dans cet exemple 2, on a repris tout le code qui permet de saisir un entier entre 4 et 17 (voir exercice précédent) pour l'organiser sous la forme d'une fonction.

Cette fonction n'a besoin d'aucun paramètre (il n'y a rien entre les parenthèses, ligne 1) et elle retourne la valeur de a saisie par l'utilisateur (ligne 10)

Si vous recopiez et exécutez ce code, il ne se passera rien: l'interpréteur prendra juste connaissance de la manière dont cette fonction est définie.

Par contre si vous écrivez print(saisir_entier()+1) à la ligne 12, l'ordinateur "appellera" la fonction (l'exécutera) et affichera l'entier consécutif à celui renvoyé par la fonction de saisie

Reprenons maintenant depuis le début. Pour définir une fonction une seule instruction suffit:

def NomDeLaFonction(paramètres éventuels):

D'un point de vue de la syntaxe, cette instruction se termine par deux points ":" et toutes les instructions contenues dans la définition de la fonction sont écrites avec une indentation vers la droite par rapport au niveau de la fonction

exemple 3

Dans cet exemple 3, la fonction salutations est définie pour afficher le texte 'bonjour'.

Si on exécute un tel script, il ne se passe rien car la fonction est correctement définie (pas de message d'erreur) mais elle n'a pas encore été appelée par le programme principal

exemple 4

Dans l'exemple 4, la fonction précédent est appelée (à la ligne 4): elle s'exécute et affiche le texte

Cette fonction n'a pas de paramètre d'entrée mais au moment de l'appeler il ne faut pas oublier d'ouvrir et de fermer les parenthèses ()

exemple 5

exemple 5

Dans l'exemple 5, on a amélioré la fonction en lui ajoutant un paramètre d'entrée (prenom) qui est ajouté lors de l'affichage. De manière implicite, le paramètre prenom est une chaine de caractères. Dans le cas contraire, cela génèrera une erreur lors de l'opération 'bonjour' + prenom

exemple 6

A travers l'exemple 6, on voit comment on peut écrire différemment la même fonction. Dans ce cas, la fonction n'affiche plus rien mais elle renvoie une chaine de caractères paramétrée, c'est à dire une chaine de caractères qui varie selon la valeur du paramètre d'entrée.

En réalité, on préfère souvent ce type de fonction car cela permet de différentier les taches invisibles de la gestion des affichages.

exemple 7

La fonction moyenne définie dans l'exemple 7 permet de renvoyer la moyenne (type float) de trois nombres a, b et c passés en paramètres

Comme on peut le voir, il est indispensable de passer le bon nombre de paramètres lorsqu'on appelle la fonction sans quoi l'interpréteur génère un message d'erreur

paramètre manquant = missing argument

exemple 7

EXERCICES

Exercice 1: Définir une fonction qui, en fonction du chiffre a, affiche la table de multiplication de a

Exercice 2: Définir une fonction qui, en fonction de deux entiers positifs a et b, renvoie l'entier obtenu par juxtaposition. Par exemple si a = 17 et b = 437 alors la fonction renvoie l'entier 17437

Exercice 3: Définir une fonction qui, en fonction d'une chaine de caractère donnée, renvoie la chaine de caractères renversée. Par exemple, à 'fonction' elle renvoie 'noitcnof'

Correction exercice 1

# un script possible

def TableDe(a):

for i in range (1,11):

print(i*a, end=' ')


Correction exercice 2

# un script possible. Le plus simple pour juxtaposer deux objets reste de travailler avec des chaines de caractères. L'idée est donc de transformer momentanément les deux entiers en chaine de caractères, de les coller puis de transformer le résultat en un entier.

def Colle(a,b):

c = str(a)+str(b)

return int(c)


# un bon moyen de tester que votre script n'accepte que des paramètres numériques est de tester l'instruction:

# print(Colle(18+1,73*5))


Correction exercice 3

# un script possible

def renverse(texte):

L = len(texte) # L est la longueur du texte. La variable texte possède L caractères d'indices allant de 0 à L-1

texteR = '' # Le texte renversé est initialisé vide

for i in range(L):

texteR = texteR + texte[L-i-1] # pour chaque valeur de i de 0 à L-1 on juxtapose le caractère d'indice L-i-1

return texteR



# un autre script, plus élégant

def renverse(texte):

texteR = ''

for c in texte: # voir la section suivante pour une explication plus détaillée de cette manière de parcourir le texte

texteR = c + texteR

return texteR


Les instructions de python que vous connaissez déjà sont elles aussi des fonctions. Par exemple, l'instruction int(a) convertit, lorsque cela est possible, le contenu de la variable a en un nombre entier. Elle retourne une valeur entière en fonction du contenu initial. Sa définition est rangée dans une bibliothèque importée par défaut.

Lorsqu'une fonction est susceptible d'être utilisée plus tard dans un autre script ou par un autre programmeur on peut la conserver dans une bibliothèque spécifique. Une bibliothèque (ou module) contient la définition de toutes les fonctions qui y sont rangées. Si la bibliothèque n'est pas importée par défaut, pour pouvoir appeler une fonction, il faut utiliser l'instruction import (voir section précédente)