06 - Fonctions (1)
Les exercices se font dans Thonny, dans le fichier 06_fonctions_1.py.
Cours associé : 08 - Fonctions .
Exercice 1 : QCM – vérification des prérequis
Pour chaque question, une seule réponse est correcte.
1. Quelle est la différence entre print() et return dans une fonction ?
- A. Il n’y a aucune différence
- B.
print()affiche un résultat ;returnrenvoie une valeur utilisable par le programme - C.
returnaffiche un résultat ;print()renvoie une valeur - D.
returnne peut être utilisé que dans la console
Correction
Réponse : B. print() se contente d’afficher à l’écran : le résultat n’est pas réutilisable. return renvoie une valeur que l’on peut stocker dans une variable ou utiliser dans une expression.
- A est faux : la différence est fondamentale pour la réutilisabilité du code.
- C est faux : c’est l’inverse.
- D est faux :
returns’utilise dans le corps d’une fonction, pas dans la console.
2. Que renvoie cette fonction si on l’appelle avec f(3, 5) ?
def f(a, b):
return a + b
- A. Rien (la fonction ne fait que calculer)
- B. 8
- C.
(3, 5) - D.
"35"
Correction
Réponse : B. f(3, 5) renvoie 3 + 5 = 8.
- A est faux : le
returnrenvoie bien une valeur. - C est faux :
return a + brenvoie une seule valeur, la somme des deux paramètres. - D est faux : les paramètres sont des entiers, pas des chaînes. L’addition donne 8, pas une concaténation.
3. Que vaut x après l’exécution du code suivant ?
def doubler(n):
return n * 2
x = doubler(7)
- A. 7
- B. 14
- C.
None - D. Erreur
Correction
Réponse : B. doubler(7) renvoie 7 * 2 = 14, qui est stocké dans x.
- A est faux : c’est la valeur du paramètre, pas du résultat.
- C est faux :
Noneserait renvoyé si la fonction n’avait pas dereturn. - D est faux : le code est correct.
4. Que se passe-t-il si une fonction ne contient pas d’instruction return ?
- A. Erreur de syntaxe
- B. La fonction renvoie 0
- C. La fonction renvoie
None - D. La fonction ne s’exécute pas
Correction
Réponse : C. En Python, une fonction sans return renvoie implicitement None. Elle s’exécute normalement, mais ne produit pas de valeur réutilisable.
- A est faux : c’est parfaitement valide (certaines fonctions ne font qu’afficher, par exemple).
- B est faux : Python ne renvoie pas 0 par défaut.
- D est faux : la fonction s’exécute, elle ne renvoie simplement rien d’exploitable.
Exercice 2 : une fonction complète, de la documentation aux tests
On veut une fonction qui calcule l’aire d’un rectangle. Sa documentation est déjà écrite :
def aire_rectangle(longueur, largeur):
"""Calcule l'aire d'un rectangle.
Paramètres :
longueur (float) : longueur du rectangle (> 0)
largeur (float) : largeur du rectangle (> 0)
Retour :
float : l'aire du rectangle
"""
...
Remplacer
...par l’instruction qui renvoie l’aire.Indice
L’aire d’un rectangle est le produit de ses deux dimensions : écrire
returnsuivi de ce calcul.Que vaut
aire_rectangle(5, 3)? Etaire_rectangle(2.5, 4)?Écrire trois lignes
assertqui vérifient ces deux résultats et l’aire d’un carré de côté 10, puis exécuter le programme.Indice
assert conditionne fait rien quand la condition est vraie, et arrête le programme avec une erreur sinon. Par exemple :assert aire_rectangle(5, 3) == 15.Pourquoi la fonction renvoie-t-elle l’aire avec
returnau lieu de l’afficher avecprint?Indice
Une valeur renvoyée peut être rangée dans une variable, comparée dans un
assertou réutilisée dans un calcul : est-ce possible avec un simple affichage ?
Correction
1. L’aire est le produit de la longueur par la largeur :
def aire_rectangle(longueur, largeur):
"""Calcule l'aire d'un rectangle.
Paramètres :
longueur (float) : longueur du rectangle (> 0)
largeur (float) : largeur du rectangle (> 0)
Retour :
float : l'aire du rectangle
"""
return longueur * largeur
2. aire_rectangle(5, 3) vaut 15 et aire_rectangle(2.5, 4) vaut 10.0.
3. Si l’une des assertions est fausse, Python s’arrête sur une erreur ; sinon, le message final s’affiche.
assert aire_rectangle(5, 3) == 15
assert aire_rectangle(2.5, 4) == 10.0
assert aire_rectangle(10, 10) == 100
print("Tous les tests passent.")
4. Une fonction qui renvoie son résultat peut être réutilisée dans un autre calcul, par exemple 2 * aire_rectangle(5, 3), ou vérifiée par un assert. Un print se contente d’afficher le nombre à l’écran : le programme ne pourrait rien en faire ensuite. On sépare donc toujours le calcul (return) de l’affichage (print).
Exercice 3 : fonctions guidées
3.1 Maximum de deux nombres
Compléter la fonction suivante :
def max2(a, b):
"""Renvoie le plus grand des deux nombres a et b."""
if ___:
return ___
else:
return ___
# Tests
assert max2(3, 7) == 7
assert max2(10, 2) == 10
assert max2(5, 5) == 5
Indice
La condition compare a et b ; chaque return renvoie l’un des deux nombres.
Correction
def max2(a, b):
"""Renvoie le plus grand des deux nombres a et b."""
if a >= b:
return a
else:
return b
assert max2(3, 7) == 7
assert max2(10, 2) == 10
assert max2(5, 5) == 5
print("Tests OK")
3.2 Réutilisation de fonctions
En utilisant max2, écrire max3(a, b, c) qui renvoie le plus grand de trois nombres.
Indice
Le plus grand des trois nombres est le plus grand entre c et le plus grand de a et b : appeler max2 deux fois.
Correction
def max3(a, b, c):
"""Renvoie le plus grand des trois nombres."""
return max2(max2(a, b), c)
assert max3(1, 2, 3) == 3
assert max3(5, 1, 3) == 5
assert max3(2, 8, 4) == 8
print("Tests OK")
Principe : on réutilise une fonction existante plutôt que de réécrire la logique. C’est la modularité.
Exercice 4 : fonctions avec domaines variés
4.1 Indice de masse corporelle (biologie)
Écrire une fonction imc(masse, taille) qui prend la masse en kg et la taille en mètres, et renvoie l’IMC arrondi à une décimale.
Formule : $\text{IMC} = \frac{\text{masse}}{\text{taille}^2}$
# Exemples :
print(imc(70, 1.75)) # 22.9
print(imc(85, 1.80)) # 26.2
Indice
Calculer masse / taille ** 2, puis arrondir avec round(..., 1) avant de renvoyer le résultat.
Correction
def imc(masse, taille):
"""Calcule l'IMC.
Paramètres :
masse (float) : masse en kg
taille (float) : taille en m
Retour :
float : IMC arrondi à 1 décimale
"""
return round(masse / taille ** 2, 1)
assert imc(70, 1.75) == 22.9
assert imc(85, 1.80) == 26.2
print("Tests OK")
4.2 Vitesse moyenne (sport)
Écrire une fonction vitesse(distance_km, temps_min) qui calcule la vitesse moyenne en km/h.
# Exemples :
print(vitesse(10, 50)) # 12.0 (10 km en 50 min)
print(vitesse(42.195, 125)) # 20.3 (marathon en 2h05)
Indice
Convertir d’abord le temps en heures, en divisant par 60. La vitesse est la distance divisée par ce temps ; l’arrondir à une décimale, comme dans les exemples.
Correction
def vitesse(distance_km, temps_min):
"""Calcule la vitesse moyenne en km/h."""
temps_h = temps_min / 60
return round(distance_km / temps_h, 1)
assert vitesse(10, 50) == 12.0
assert vitesse(42.195, 125) == 20.3
print("Tests OK")
Point important : il faut convertir les minutes en heures avant de diviser.
4.3 Conversion de recette (cuisine)
Écrire une fonction adapter_recette(quantite, nb_personnes_base, nb_personnes_cible) qui adapte une quantité d’ingrédient d’une recette prévue pour un certain nombre de personnes.
# 200 g de farine pour 4, combien pour 6 ?
print(adapter_recette(200, 4, 6)) # 300.0
Indice
Règle de trois : calculer la quantité pour une personne, puis la multiplier par le nombre de personnes visé.
Correction
def adapter_recette(quantite, nb_base, nb_cible):
"""Adapte une quantité d'ingrédient au nombre de personnes."""
return round(quantite * nb_cible / nb_base, 1)
assert adapter_recette(200, 4, 6) == 300.0
assert adapter_recette(150, 4, 2) == 75.0
print("Tests OK")
Exercice 5 : constructibilité d’un triangle (mathématiques)
Écrire une fonction
constructible(a, b, c)qui renvoieTruesi un triangle de côtés $a$, $b$, $c$ est constructible (inégalité triangulaire : chaque côté est strictement inférieur à la somme des deux autres).Indice
Trois conditions à vérifier ensemble avec
and, la première étanta < b + c. La fonction peut renvoyer directement la condition complète, qui vautTrueouFalse.Écrire une fonction
aire_triangle(a, b, c)qui calcule l’aire d’un triangle à l’aide de la formule de Héron : $$A = \sqrt{p(p-a)(p-b)(p-c)}$$ où $p = \frac{a+b+c}{2}$ est le demi-périmètre.Indice
Calculer d’abord
p, puis la racine carrée avecmath.sqrt, aprèsimport mathen tête du programme.Code à copier puis compléter
import math def aire_triangle(a, b, c): p = ... return math.sqrt(...)Tester avec un triangle rectangle 3-4-5 (aire attendue : 6).
Correction
import math
def constructible(a, b, c):
"""Vérifie si un triangle de côtés a, b, c est constructible."""
return a < b + c and b < a + c and c < a + b
def aire_triangle(a, b, c):
"""Calcule l'aire par la formule de Héron."""
assert constructible(a, b, c)
p = (a + b + c) / 2
return round(math.sqrt(p * (p - a) * (p - b) * (p - c)), 2)
assert constructible(3, 4, 5) == True
assert constructible(1, 1, 10) == False
assert aire_triangle(3, 4, 5) == 6.0
print("Tests OK")