Inititation à la programmation avec Python (niveau 2nde)

Épisode n°2 : les fonctions

Pour constuire un projet conséquent, il y a souvent beaucoup de petites tâches à assembler et à créer. En programmation, chacune de ces tâches élémentaires (comme des microprogrammes) sont écrites dans des fonctions.

Définition d'une fonction

Une fonction est introduite avec le mot clef def suivie du nom de la fonction, puis entre parenthèses les paramètres d'entrée de la fonction.

Voyons un exemple assez simple pour commencer : on désire créer une fonction qui renvoie la somme de deux nombres. Observez la construction de cette fonction dans la cellule suivante :

In [1]:
# notre 1ère fonction :
def somme(a, b):
    resultat = a + b
    return resultat

Lors de l'exécution de la cellule précédente, rien ne se passe (rien de visible en tout cas). On vient juste de définir "une boite noire" capable de calculer la somme de 2 nombres a et b et de renvoyer le résultat de cette opération.

Pour que cette fonction deviennet opérante concrètement, il faut l'appeler (on dit aussi l'invoquer) avec des valeurs pour ses paramètres d'entrée a et b. Voyez comment ci-dessous :

In [2]:
# appel de la fonction somme définie précédemment :
somme(5, 7)
Out[2]:
12

Lors de l'appel de la fonction, son paramètre a prend la valeur 5 et son paramètre b la valeur 7. Ensuite dans le corps de la fonction, la somme des contenus des variables a et b est affectée à la variable resultat et cette variable est renvoyée par la fonction, avec le mot clef return.

On peut bien entendu affecter à une autre variable la valeur renoyée par une fonction.

Observez :

In [3]:
calcul = somme(12, -5)
print("La somme de 12 et -5 vaut :", calcul)
La somme de 12 et -5 vaut : 7

Quelques précisions sur l'écriture d'une fonction :

Avez-vous remarqué les deux points (:) à la fin de la ligne de signature de la fonction, après les parenthèses ? Ils sont obligatoires ! C'est le langage Python qui les impose.

Ensuite, le reste du code défini dans la fonction est décalé par rapport à la marge. Cela s'appelle une indentation (4 espaces ou une tabulation).

Le rôle de l'indentation n'est pas seulement de "faire joli", même si ça aide bien la lecture du code (c'est d'ailleurs quand même un de ses buts). Le rôle premier de l'indentation est de délimiter un bloc de code, une suite d'instructions qu'il faut exécuter ensembles.

Remarque : on trouvera des blocs de code indentés à chaque fois que l'on croise deux points (:) en Python.

Finalement, on l'a déjà évoqué, la fonction renvoie une sortie, avec le mot clef return : le résultat de son action.

Remarque : certaines fonctions peuvent effectuer une tache sans renvoyer de résultat particulier.

In [4]:
# voici un autre exemple de définition de fonction : essayez de deviner son action...
def f(x):
    x = 5 * x
    return x

# notez bien qu'on arrête l'indentation (donc on quitte la fonction), et on écrit de nouveau au bord de la marge :
nombre = 8      # affection de la valeur 8 à la variable nombre
a = f(nombre)   # appel de la fonction f avec le contenu de la variable nombre comme valeur du paramètre d'entrée x
print(a)        # affichage du résultat
print(nombre)   # remarquez que la variable nombre n'a pas changé
40
8

Exercices :

1- Écrire une fonction augmente qui prend un nombre comme paramètre d'entrée et qui renvoie ce nombre augmenté de 3.

Faire un appel à cette fonction pour contrôler son bon fonctionnement.

In [5]:
# à vous de jouer ci-dessous :
def augmente(n):
    res = n + 3
    return res

2- Écrire une fonction augmente_n qui prend deux paramètres d'entrée :

  • un nombre (x) à augmenter
  • la valeur (n) dont on doit augmenter ce nombre

Faire un appel à cette fonction pour contrôler son bon fonctionnement.

In [6]:
# à vous de jouer
def augmente_n(x, n):
    res = x + n
    return res

augmente_n(10, 7)
Out[6]:
17

3- Écrire une fonction qui calcule la vitesse d'un véhicule connaissant la distance parcourue et la durée du trajet.

Choisissez des noms pertinents pour les paramètres d'entrée.

Rappel : v = d / t

Et bien entendu, testez l'appel de votre fonction pour vérifier si elle semble bien faire son travail.

In [7]:
# à vous de jouer
def vitesse(distance, temps):
    return distance / temps

d, t = 10, 2
vitesse(d, t)
Out[7]:
5.0

4- Écrire une fonction qui calcule la surface d'un rectangle.

Indice : pensez quels sont les paramètres d'entrée.

Et n'oubliez d'appeler la fonction pour la tester.

In [8]:
# à vous de jouer
def surface_rectangle(L, l):
    return L * l

surface_rectangle(5, 3)
Out[8]:
15

5- Écrire une fonction age qui calcule l'âge d'une personne.

Quel sont les paramètres d'entrée ? (ne cherchez pas à fignoler avec le mois et le jour de naissance...)

Et n'oubliez d'appeler la fonction pour la tester.

In [9]:
# à vous de jouer
def age(annee_naissance, annee_en_cours):
    return annee_en_cours - annee_naissance

age(2004, 2020)
Out[9]:
16

6- Écrire une fonction accueil qui affiche un message de bienvenue

Elle prend en paramètre le nom d'une personne (c'est une chaine de caractères) et elle écrit :

"Bienvenue à toi, <nom de la personne> !"

Cette fonction ne renvoie rien.

Et n'oubliez d'appeler la fonction pour la tester.

In [10]:
# à vous de jouer
def accueil(nom):
    print("Bienvenue à toi,", nom)
    
accueil("Antoine")
Bienvenue à toi, Antoine

Fonction qui utilise une fonction !

Une fonction peut bien entendu appeler une autre fonction.

L'exemple suivant s'appuie sur les 2 fonctions que vous venez de créer.

In [11]:
def accueil_age_2050(nom, naissance):
    """ 
    Cette fonction écrit un message d'accueil,
    et annonce votre âge en 2050 ! 
    """
    annee = 2050  # définition d'une variable dans le corps de la fonction
    accueil(nom)  # appel à la fonction accueil pour écrire un début de message
    futur_age = age(naissance, annee) # calcul de l'âge en 2050
    print("En", annee, ", tu auras :", futur_age,"ans.")  # affichage prophétique  
In [12]:
accueil_age_2050('Tony', 2004)
Bienvenue à toi, Tony
En 2050 , tu auras : 46 ans.

Fonction qui ne prend aucun paramètre en entrée, et qui renvoie quelque chose...

Une fonction peut aussi servir effectuer une tâche qui ne dépend d'aucun paramètre d'entrée.

On pourrait par exemple imaginer une fonction qui crée un nombre alétaoire entre 1 et 10 (idée bizarre, OK...).

Ne cherchez pas à comprendre toutes les lignes de la cellule suivante (volontairement compliquée) : le but est juste de faire des appels répétés à la fonction hasard et de vérifier qu'elle fait bien le travail souhaité.

In [13]:
# dans cette cellule, on crée la fonction souhaitée
from random import choice

def hasard():
    liste = [i for i in range(1, 11)]
    nombre = choice(liste)
    return nombre
In [14]:
# exécutez plusieurs fois de suite cette cellule pour tester notre fonction.
hasard()
Out[14]:
8

Le point à noter est qu'il ne faut pas oublier les parenthèses, même si la fonction ne prend aucun paramètre d'entrée.

Une dernière remarque avant de se quitter

Vous avez remarqué que chaque ligne de code qui commence par un dièse # n'est pas interprétée par Python. On appelle cela un commentaire, cela permet d'éclairer son code pour qu'il soit lu aisément : ça facilite la compréhension !

To be continued... Pour la suite, ouvrez le notebook n°3.

Cliquer dans le menu File -> Close and Halt (en Français : Fichier -> Fermer et Arrêter), puis ouvrir le fichier Python-initiation-3.ipynb.

In [ ]: