Fonctions et mini-calculatrice
Créez un compte gratuit pour suivre votre avancement et reprendre où vous avez laissé.
Créer un compteTes propres fonctions Python
Jusqu'ici, tu utilises des fonctions toutes faites : print, len, int, random.randint… Mais que faire quand tu veux calculer trois fois la même chose dans un programme — par exemple le périmètre de cinq rectangles ? Recopier le calcul cinq fois est une mauvaise idée : tu dupliques du code, tu risques d'oublier une copie quand tu modifies la formule. La solution s'appelle une fonction : tu écris la recette une seule fois, tu lui donnes un nom, et tu peux ensuite la rappeler autant de fois que tu veux.
À la fin de cette fiche, tu sauras définir une fonction avec def, lui passer des paramètres, récupérer une valeur avec return, distinguer une variable locale d'une variable globale, donner une valeur par défaut à un paramètre, et enfin assembler plusieurs fonctions pour construire une mini-calculatrice.
Remarque
Comment lire cette fiche. Tu vas rencontrer deux types d'exercices à la suite des explications :
- Complète le programme — 1 ou 2 mots à compléter, juste après chaque nouveau concept.
- À toi de jouer — un petit programme à finir, en fin de section.
Chaque cellule s'exécute en cliquant sur Exécuter. En cas d'erreur, lis le message rouge : il indique la ligne fautive et le type d'erreur.
Définir et appeler une fonction
Une fonction se déclare avec le mot-clé def, suivi du nom de la fonction, de parenthèses, et de deux points. Le code de la fonction (son corps) est indenté de 4 espaces sous la ligne def.
Définir une fonction ne l'exécute pas : c'est seulement quand tu écris saluer() (avec les parenthèses) qu'elle se déclenche. Dans l'exemple, le message s'affiche deux fois parce qu'on appelle la fonction deux fois.
Complète le programme
Définis une fonction bonjour qui affiche `Salut le monde !`, puis appelle-la trois fois :
Voir la solution
def bonjour():
print('Salut le monde !')
bonjour()
bonjour()
bonjour()Complète le programme
Complète la définition de la fonction applaudir qui affiche cinq fois `Bravo !` :
Voir la solution
def applaudir():
for i in range(5):
print('Bravo !')
applaudir()À toi de jouer
Écris une fonction afficher_menu qui affiche les trois options d'un menu (« 1. Jouer », « 2. Options », « 3. Quitter ») sur trois lignes. Appelle-la une fois pour vérifier.
Voir la solution
def afficher_menu():
print('1. Jouer')
print('2. Options')
print('3. Quitter')
afficher_menu()Remarque
Spécificité Python — l'indentation fait foi. En C, Java ou JavaScript, le corps d'une fonction est entouré d'accolades { }. En Python, il n'y a pas d'accolades : le corps est simplement le bloc indenté sous la ligne def. Si tu oublies l'indentation, Python lève une IndentationError avant même d'exécuter la moindre ligne. Convention universelle : 4 espaces, jamais de tabulation mélangée.
Paramètres et arguments
Une fonction sans paramètre fait toujours la même chose. Pour qu'elle s'adapte, on lui donne des paramètres : des variables qu'elle reçoit au moment de l'appel.
Vocabulaire : prenom est un paramètre (vu côté définition), "Léa" est un argument (vu côté appel). Mais en pratique on emploie souvent les deux mots indifféremment.
Complète le programme
Définis une fonction carre qui prend un nombre et affiche son carré. Appelle-la avec 9.
Voir la solution
def carre(n):
print(n ** 2)
carre(9)Complète le programme
Complète la fonction annoncer_age qui prend un prénom et un âge, et affiche par exemple `Léa a 15 ans` :
Voir la solution
def annoncer_age(prenom, age):
print(prenom, 'a', age, 'ans')
annoncer_age('Léa', 15)À toi de jouer
Écris une fonction table qui prend un entier n et affiche la table de multiplication de n (de n × 1 à n × 10). Teste-la avec table(7).
Voir la solution
def table(n):
for i in range(1, 11):
print(n, 'x', i, '=', n * i)
table(7)Remarque
Spécificité Python — l'ordre et le nommage des arguments. En Python, tu peux passer les arguments dans l'ordre (aire_rectangle(12, 7)) ou par leur nom (aire_rectangle(largeur=7, longueur=12)). Les arguments nommés sont très lisibles dès qu'une fonction a 3 ou 4 paramètres : on évite l'erreur classique « lequel était la longueur, déjà ? ». C'est un confort que Java ou C n'ont pas en standard.
La valeur de retour : `return`
Une fonction qui se contente d'afficher est utile, mais limitée : tu ne peux pas réutiliser le résultat. Une vraie fonction (au sens mathématique du terme) retourne une valeur avec le mot-clé return, et on récupère cette valeur dans une variable.
Quand Python rencontre return, il quitte immédiatement la fonction et renvoie la valeur. Tout ce qui suit n'est pas exécuté.
Une fonction sans return (comme print ou notre saluer de tout à l'heure) renvoie en réalité une valeur spéciale : None, qui veut dire « rien ».
Complète le programme
Définis une fonction double qui retourne (et n'affiche pas) le double d'un nombre. Vérifie en stockant le résultat.
Voir la solution
def double(n):
return 2 * n
x = double(21)
print(x)Complète le programme
Complète la fonction est_pair qui retourne True si un entier est pair, False sinon :
Voir la solution
def est_pair(n):
return n % 2 == 0
print(est_pair(10))
print(est_pair(7))À toi de jouer
Écris une fonction maximum qui prend deux nombres et renvoie le plus grand des deux (sans utiliser la fonction max de Python). Teste-la avec plusieurs paires.
Voir la solution
def maximum(a, b):
if a > b:
return a
return b
print(maximum(7, 3))
print(maximum(2, 9))
print(maximum(5, 5))Remarque
Spécificité Python — `return` vs `print`. Confondre print et return est l'erreur de débutant numéro un. print(x) affiche x à l'écran ; return x renvoie x à l'endroit où la fonction a été appelée, pour qu'on puisse stocker, calculer, comparer. Une fonction qui ne fait que print est aveugle pour le reste du programme : impossible de récupérer son résultat. Règle simple : si tu veux réutiliser le résultat, utilise return.
Plusieurs paramètres et valeurs par défaut
Une fonction peut prendre autant de paramètres que tu veux. Tu peux aussi donner une valeur par défaut à un paramètre : si l'appel ne fournit pas l'argument, c'est cette valeur qui sert.
Les paramètres avec valeur par défaut doivent figurer à la fin de la liste des paramètres, jamais avant les paramètres obligatoires.
Complète le programme
Définis une fonction puissance qui prend une base et un exposant (par défaut 2) et renvoie la puissance.
Voir la solution
def puissance(base, exposant=2):
return base ** exposant
print(puissance(5))
print(puissance(2, 10))Complète le programme
Complète la fonction moyenne3 qui prend trois notes et renvoie leur moyenne arithmétique :
Voir la solution
def moyenne3(a, b, c):
return (a + b + c) / 3
print(moyenne3(12, 14, 16))À toi de jouer
Écris une fonction prix_ttc qui prend un prix hors taxe et un taux de TVA (en pourcentage, par défaut 20) et renvoie le prix TTC arrondi à deux décimales (utilise round(x, 2)).
Voir la solution
def prix_ttc(ht, tva=20):
return round(ht * (1 + tva / 100), 2)
print(prix_ttc(50))
print(prix_ttc(50, 5.5))
print(prix_ttc(99.99, 10))Remarque
Spécificité Python — piège des valeurs par défaut mutables. Une valeur par défaut est évaluée une seule fois, au moment où Python lit la ligne def. Si tu écris def f(x, liste=[]), la même liste est partagée entre tous les appels qui n'en passent pas — et les ajouts s'accumulent d'un appel à l'autre. C'est un classique des bugs fantômes en Python. Règle de sécurité : ne jamais utiliser une liste, un dictionnaire ou un autre objet mutable comme valeur par défaut. Préférer None et créer la liste à l'intérieur de la fonction.
Variables locales et globales
Une variable créée à l'intérieur d'une fonction n'existe que pendant l'exécution de cette fonction : on dit qu'elle est locale. Dès que la fonction se termine, elle disparaît — comme un brouillon qu'on jette.
Lance la cellule : tu obtiens une NameError sur la dernière ligne, parce que secret n'existe pas en dehors de calcul. C'est une bonne nouvelle : chaque fonction a son espace de travail isolé, elle ne risque pas de modifier par accident une variable d'un autre endroit du programme.
À l'inverse, une variable définie hors de toute fonction est globale : la fonction peut la lire sans formalité.
Mais modifier une variable globale depuis une fonction est plus subtil : par défaut, Python crée une nouvelle variable locale du même nom, et la globale reste intacte. Pour vraiment la modifier, il faut le déclarer explicitement avec global (rarement utile dans la vraie vie — préférer return).
Complète le programme
Complète la fonction incrementer : elle prend un compteur en argument et renvoie sa valeur augmentée de 1. (Évite global : passe par un return.)
Voir la solution
def incrementer(c):
return c + 1
compteur = 0
compteur = incrementer(compteur)
compteur = incrementer(compteur)
print(compteur)Complète le programme
La constante TVA est définie en dehors de la fonction. Complète ajouter_tva pour l'utiliser :
Voir la solution
TVA = 20
def ajouter_tva(ht):
return ht * (1 + TVA / 100)
print(ajouter_tva(100))À toi de jouer
Écris une fonction nombre_voyelles qui prend une chaîne et renvoie le nombre de voyelles qu'elle contient (a, e, i, o, u, y, sans accents, sans casse). Utilise une variable locale compteur que tu fais évoluer dans une boucle.
Voir la solution
def nombre_voyelles(texte):
compteur = 0
for lettre in texte.lower():
if lettre in 'aeiouy':
compteur = compteur + 1
return compteur
print(nombre_voyelles('Bonjour'))
print(nombre_voyelles('Mathematiques'))Remarque
Spécificité Python — la règle LEGB. Quand Python rencontre un nom de variable dans une fonction, il le cherche dans cet ordre : Local (la fonction elle-même), Enclosing (fonctions englobantes), Global (le module), puis Built-in (print, len…). C'est précisément ce qui te permet d'utiliser print dans n'importe quelle fonction : il vit au niveau Built-in. Et c'est aussi pour cela qu'il ne faut jamais nommer une variable list, str ou print — tu masquerais le built-in et casserais ton programme.
Composer : une mini-calculatrice
Le vrai pouvoir des fonctions, c'est qu'on peut les combiner : une fonction en appelle une autre, et on construit ainsi un programme structuré et lisible. Voici une petite calculatrice qui découpe le travail en quatre fonctions élémentaires plus une fonction « chef d'orchestre ».
Chaque fonction fait une seule chose et la fait bien. Si tu dois corriger la division (par exemple ajouter un arrondi), tu n'as qu'un endroit à modifier. C'est l'idée fondamentale du découpage en programmation.
Complète le programme
Ajoute à la calculatrice une opération "^" (puissance) qui renvoie a ** b. Teste avec calcule(2, "^", 10).
Voir la solution
def puissance(a, b):
return a ** b
def calcule(a, op, b):
if op == '+':
return a + b
if op == '-':
return a - b
if op == '^':
return puissance(a, b)
return 'Opération inconnue'
print(calcule(2, '^', 10))
print(calcule(7, '+', 5))Complète le programme
Complète la fonction aire_triangle_rectangle : elle prend les deux côtés de l'angle droit et renvoie l'aire (en réutilisant multiplication et division).
Voir la solution
def multiplication(a, b):
return a * b
def division(a, b):
return a / b
def aire_triangle_rectangle(c1, c2):
return division(multiplication(c1, c2), 2)
print(aire_triangle_rectangle(6, 4))À toi de jouer
Écris deux fonctions : prix_unitaire(total, quantite) qui renvoie le prix d'un article, et meilleure_offre(t1, q1, t2, q2) qui prend deux paniers (total, quantité) et renvoie "offre 1", "offre 2" ou "égalité" selon laquelle est la moins chère à l'unité. La deuxième fonction doit appeler la première.
Remarque
Spécificité Python — une fonction est une valeur. Comme un nombre ou une chaîne, une fonction peut être assignée à une variable, passée en argument, ou stockée dans une liste. Cela ouvre la porte à des constructions très puissantes (callbacks, map, filter). C'est moins direct en Java ou en C, où une fonction n'est pas une « valeur de première classe ».
Pour aller plus loin
Docstrings — documenter sa fonction. Une chaîne placée sur la première ligne du corps d'une fonction sert de documentation. Les outils Python (éditeurs, help) la lisent automatiquement.
Type hints — annoter les types attendus. Python est typé dynamiquement, mais on peut indiquer les types attendus dans la signature. Python ne vérifie rien par défaut, mais ces annotations aident énormément la relecture et les outils comme mypy. Contrairement à Java où le type est obligatoire, en Python c'est optionnel — tu en mets quand ça apporte de la clarté.
Les fonctions sont des valeurs : une mini-calculatrice élégante. Plutôt qu'une longue chaîne de if/elif, on peut ranger les opérations dans un dictionnaire qui associe un symbole à une fonction. C'est l'idiome Pythonique.
Lambda — fonction anonyme en une ligne. Quand une fonction est ultra-courte et utilisée à un seul endroit, on peut la définir « inline » avec lambda. À utiliser avec parcimonie : au-delà d'une ligne, def reste plus lisible.
À toi de jouer
À ton tour : crée un dictionnaire formules qui associe trois noms de figures (`"carre"`, `"rectangle"`, `"disque"`) à des lambdas qui calculent leur aire. Ensuite, écris une fonction aire(forme, *args) qui appelle la bonne lambda. (Indice : *args permet d'accepter un nombre variable d'arguments — un pour le carré et le disque, deux pour le rectangle.)
Voir la solution
formules = {
'carre': lambda c: c * c,
'rectangle': lambda L, l: L * l,
'disque': lambda r: 3.14159 * r * r,
}
def aire(forme, *args):
return formules[forme](*args)
print(aire('carre', 5))
print(aire('rectangle', 12, 7))
print(aire('disque', 4))Comparaison rapide. En C, une fonction doit être déclarée avec son type de retour et le type de chaque paramètre, et ne peut pas être assignée à une variable. En Java, idem, et il faut une « interface fonctionnelle » pour passer une fonction en argument. En JavaScript, comme en Python, les fonctions sont des valeurs de première classe — c'est ce qui rend ces deux langages si à l'aise pour la programmation par callbacks.
Ce que tu as appris
- Une fonction se définit avec
def nom(parametres):et un corps indenté de 4 espaces. - L'appel utilise les parenthèses :
nom(arguments). Sans parenthèses, on désigne la fonction sans l'exécuter. returnrenvoie une valeur et termine la fonction. Sansreturn, la fonction renvoieNone.- Ne pas confondre
print(afficher à l'écran) etreturn(renvoyer pour réutiliser). - Les paramètres peuvent avoir une valeur par défaut :
def f(x, y=10):. Les défauts viennent toujours en dernier. - Une variable créée dans une fonction est locale : elle disparaît à la sortie. Une variable globale est lisible partout, mais préférer
returnpour la modifier. - Décomposer un programme en petites fonctions claires (« une fonction = une responsabilité ») le rend lisible, testable et corrigeable.
Et après…
Tu vas apprendre à explorer les suites numériques avec Python — calculer des termes par récurrence, accumuler une somme, et tracer un premier graphique pour visualiser la croissance ou la convergence.