Fonctions et simulations : définir et appeler une fonction avec ou sans arguments

2ndeMathematiquesFonctions et simulationsDéfinir et appeler une fonction avec ou sans arguments~8 min de lecture

Fonctions et simulations : définir et appeler une fonction, avec ou sans arguments

En Python, une fonction est une petite machine à laquelle on donne un nom avec def : on l'écrit une fois, puis on l'appelle autant de fois qu'on veut, en lui donnant éventuellement des valeurs (les arguments) et en récupérant un résultat avec return.

Objectifs

  • Définir une fonction en Python avec def, avec ou sans paramètres.
  • Appeler une fonction en lui passant des arguments et utiliser la valeur renvoyée.
  • Distinguer return (renvoyer une valeur) et print (afficher).
  • Faire le lien avec les fonctions mathématiques \(x\mapsto f(x)\).
  • Utiliser des fonctions pour une simulation simple (lancer de dé).

1. Qu'est-ce qu'une fonction ?

Une fonction est un bloc d'instructions auquel on donne un nom. On distingue deux moments :

  • la définition : on écrit ce que fait la fonction (on construit la machine) ;
  • l'appel : on demande à la fonction de travailler (on fait marcher la machine).

Syntaxe de la définition :

def nom_de_la_fonction(parametre1, parametre2):
    instructions
    return resultat
  • def annonce la définition ; la ligne se termine par deux-points :.
  • Les instructions de la fonction sont indentées (décalées de 4 espaces).
  • Les paramètres sont les noms des entrées, entre parenthèses.
  • return renvoie le résultat et termine la fonction.
flowchart LR
A[Appel avec des arguments] --> B[Parametres recoivent les valeurs]
B --> C[Instructions executees]
C --> D[return renvoie le resultat]
D --> E[Suite du programme]

Quel mot-clé sert à définir une fonction en Python ?

  1. function
  2. return
  3. def
On définit une fonction avec def suivi de son nom, de parenthèses et de deux-points. return sert à renvoyer le résultat.

2. Fonction avec arguments

def prix_pains(n):
    return 150 * n

total = prix_pains(4)
print(total)
  • n est le paramètre : un nom dans la définition.
  • 4 est l'argument : la valeur donnée au moment de l'appel. Pendant cet appel, n vaut 4.
  • La fonction renvoie \(150\times 4=600\) ; cette valeur est rangée dans total, puis affichée : 600.

Le lien avec les fonctions en mathématiques

La fonction mathématique \(f : x\mapsto x^2-3x+1\) s'écrit en Python :

def f(x):
    return x**2 - 3*x + 1

L'appel f(4) calcule l'image de \(4\) : \(f(4)=4^2-3\times 4+1=16-12+1=5\).

Plusieurs arguments

Une fonction peut recevoir plusieurs arguments, séparés par des virgules. L'ordre compte : le premier argument va dans le premier paramètre, et ainsi de suite.

def prix_apres_remise(prix, taux):
    return prix * (1 - taux / 100)

Exemple résolu

Une chemise à 5 000 F CFA est soldée à 20 %. Que renvoie prix_apres_remise(5000, 20) ? Cherche d'abord, puis suis l'exécution pas à pas.

À l'appel, prix reçoit 5000 et taux reçoit 20 (même ordre que dans la définition).
On calcule \(1-\dfrac{20}{100}=1-0{,}2=0{,}8\).
Puis \(5000\times 0{,}8=4000\). La fonction renvoie 4000.0 (un nombre décimal, à cause de la division).
Si on avait écrit prix_apres_remise(20, 5000), on aurait obtenu \(20\times(1-50)=-980\) : un résultat absurde, car les arguments sont inversés.

On définit def double(x): return 2*x. Qu'affiche print(double(7) + 1) ?

  1. 16
  2. 15
  3. double(7) + 1
double(7) renvoie 14, puis on ajoute 1 : l'affichage est 15.

3. Fonction sans argument

def saluer():
    print("Bonjour Awa, bon courage pour le devoir !")

saluer()
saluer()

Ce programme affiche deux fois le message. Les parenthèses vides sont obligatoires, dans la définition comme dans l'appel.

Une fonction sans argument peut aussi renvoyer une valeur. C'est le cas pour simuler un dé :

from random import randint

def lancer_de():
    return randint(1, 6)

randint(1, 6) renvoie un entier au hasard entre 1 et 6 (inclus). Chaque appel lancer_de() donne un nouveau résultat.

Comment appelle-t-on correctement la fonction lancer_de ?

  1. lancer_de()
  2. lancer_de
  3. def lancer_de()
Un appel s'écrit avec le nom suivi de parenthèses, même vides. Avec def, on définirait la fonction au lieu de l'appeler.

4. Renvoyer ou afficher : return et print

  • return renvoie une valeur au programme qui a appelé la fonction : on peut la stocker dans une variable, la réutiliser dans un calcul. Après return, la fonction s'arrête.
  • print affiche seulement à l'écran ; la valeur n'est pas récupérable. Une fonction sans return renvoie la valeur spéciale None (rien).

Exemple résolu

def carre_affiche(x):
    print(x * x)

def carre_renvoie(x):
    return x * x

a = carre_affiche(3)
b = carre_renvoie(3)

Que valent a et b ? Qu'affiche le programme ?

Voir la solution

L'appel carre_affiche(3) affiche 9 à l'écran, mais ne renvoie rien : a vaut None.

L'appel carre_renvoie(3) n'affiche rien, mais renvoie 9 : b vaut 9, et on peut écrire b + 1.

Le programme n'affiche donc qu'une seule ligne : 9.

Variables locales : une variable créée à l'intérieur d'une fonction (y compris ses paramètres) n'existe que pendant l'appel. Après l'appel, elle disparaît ; seul le résultat renvoyé reste.

Une fonction ne contient pas d'instruction return. Que renvoie-t-elle ?

  1. 0
  2. Le dernier nombre calculé
  3. None
Sans return, une fonction Python renvoie toujours None, même si elle affiche quelque chose avec print.

5. Des fonctions pour simuler

from random import randint

def lancer_de():
    return randint(1, 6)

def frequence_six(n):
    compteur = 0
    for i in range(n):
        if lancer_de() == 6:
            compteur = compteur + 1
    return compteur / n

Explique ce que fait frequence_six(1000), puis dévoile les étapes.

Le paramètre n reçoit 1000 ; compteur démarre à 0.
La boucle se répète 1000 fois : à chaque tour, on appelle lancer_de(), qui renvoie un nombre entre 1 et 6.
Si ce nombre vaut 6, on ajoute 1 au compteur.
À la fin, la fonction renvoie la fréquence compteur / n : la proportion de « six » obtenus.
Le résultat change à chaque exécution, mais pour un grand nombre de lancers il est en général proche de \(\dfrac{1}{6}\approx 0{,}167\) : c'est la fluctuation d'échantillonnage.

Dans frequence_six, pourquoi a-t-on intérêt à appeler lancer_de() plutôt qu'à écrire randint(1, 6) directement ?

  1. Parce que randint ne marche pas dans une boucle
  2. Parce que le nom rend le programme plus lisible et qu'on peut changer le dé à un seul endroit
  3. Parce que lancer_de est plus rapide que randint
Le résultat est le même, mais la fonction donne un nom clair à l'action et regroupe le code : pour simuler un dé à 8 faces, on ne modifie que lancer_de.

Erreurs fréquentes

Récapitulatif

  • On définit une fonction avec def nom(parametres): puis un bloc indenté.
  • On l'appelle avec nom(arguments) ; sans argument, les parenthèses restent obligatoires.
  • Les arguments sont affectés aux paramètres dans l'ordre.
  • return renvoie une valeur réutilisable et termine la fonction ; print ne fait qu'afficher.
  • Les fonctions rendent les programmes lisibles et permettent de répéter une expérience aléatoire pour la simuler.
Définir une fonction
def nom(paramètres): suivi d'un bloc indenté.
Appeler une fonction
Écrire son nom suivi des arguments entre parenthèses, par exemple prix_pains(4).
Paramètre et argument
Le paramètre est le nom dans la définition ; l'argument est la valeur donnée à l'appel.
return
Renvoie une valeur au programme et arrête la fonction.
Fonction sans return
Elle renvoie None, même si elle affiche avec print.
Simulation
Appeler de nombreuses fois une fonction aléatoire (randint) pour estimer une fréquence.

Teste tes connaissances sur ce cours

Crée ton compte gratuitement pour accéder aux quiz associés et suivre ta progression.