05 - Python (2)
Les exercices se font dans Thonny, dans le fichier 05_python_2.py.
Cours associés : 03 - Opérateurs , 06 - Chaînes de caractères , 07 - Chaînes : méthodes .
Exercice 1 : QCM – vérification des prérequis
Pour chaque question, une seule réponse est correcte.
1. Que vaut l’expression 7 // 2 en Python ?
- A.
3.5 - B.
3 - C.
1 - D.
3.0
Correction
Réponse : B. L’opérateur // effectue la division entière (quotient sans la partie décimale). 7 // 2 = 3.
- A est faux :
3.5est le résultat de7 / 2(division flottante). Confusion entre/et//. - C est faux :
1est le résultat de7 % 2(reste de la division). Confusion entre//et%. - D est faux : entre deux entiers,
//renvoie un entier, pas un flottant.
2. Que vaut 2 ** 3 ?
- A.
6 - B.
8 - C.
5 - D. Erreur
Correction
Réponse : B. ** est l’opérateur de puissance en Python. 2 ** 3 signifie $2^3 = 8$.
- A est faux :
6est le résultat de2 * 3(multiplication). Confusion entre**et*. - C est faux :
5est le résultat de2 + 3(addition). - D est faux : l’expression est parfaitement valide.
3. Quelle est la valeur de 10 % 3 ?
- A.
3 - B.
3.33 - C.
1 - D.
0
Correction
Réponse : C. L’opérateur % (modulo) renvoie le reste de la division euclidienne. $10 = 3 \times 3 + 1$, donc le reste est 1.
- A est faux :
3est le quotient (10 // 3), pas le reste. - B est faux :
3.33...est le résultat de10 / 3. Confusion entre/et%. - D est faux :
0serait le résultat de9 % 3(car 9 est divisible par 3).
4. Que vaut l’expression "bon" + "jour" ?
- A.
"bon jour" - B.
"bonjour" - C.
"bonjourbonjour" - D. Erreur
Correction
Réponse : B. L’opérateur + entre deux chaînes effectue une concaténation (mise bout à bout sans espace). "bon" + "jour" donne "bonjour".
- A est faux : la concaténation ne rajoute pas d’espace. Pour obtenir
"bon jour", il faudrait"bon" + " " + "jour". - C est faux : c’est le résultat de
"bonjour" * 2. - D est faux : la concaténation de deux chaînes est valide.
Exercice 2 : heures, minutes et secondes
Un chronomètre indique une durée de 3 725 secondes. On veut l’écrire en heures, minutes et secondes.
total = 3725
heures = total // 3600
reste = total % 3600
minutes = reste // 60
secondes = reste % 60
print(f"{heures} h {minutes} min {secondes} s")
Sans exécuter le programme, calculer à la main la valeur de chaque variable.
Indice
Combien de fois 3600 tient-il dans 3725, et que reste-t-il ? Dans ce reste, combien de fois 60 tient-il ?
Qu’affiche le programme ? Vérifier dans Thonny.
Pourquoi utilise-t-on
//pour calculer les heures, et%pour calculer le reste ?Indice
Dans la division de la durée par 3600, que représente le quotient ? Et le reste ?
Modifier le programme pour une durée de 10 000 secondes. Quel résultat obtient-on ?
Correction
1. Une heure dure 3 600 secondes et une minute 60 secondes :
heuresvaut3725 // 3600, soit1;restevaut3725 % 3600, soit125;minutesvaut125 // 60, soit2;secondesvaut125 % 60, soit5.
2. Le programme affiche 1 h 2 min 5 s.
3. total // 3600 donne le nombre d’heures complètes contenues dans la durée (le quotient), et total % 3600 les secondes qui restent une fois ces heures retirées (le reste). Les opérateurs // et % vont toujours ensemble pour décomposer une grandeur : temps, monnaie, changement de base.
4. Avec total = 10000, on obtient heures = 2, reste = 2800, minutes = 46 et secondes = 40 : le programme affiche 2 h 46 min 40 s.
Exercice 3 : opérateurs
3.1 Prédiction de résultats
Essayez de deviner les résultats des opérations suivantes, puis vérifiez dans l’interpréteur :
3 / 2 ; 3 // 2 ; 3 % 2 ; 3 ** 2 ; 2e3.
print(3 / 2)
print(3 // 2)
print(3 % 2)
print(3 ** 2)
print(2e3)
Correction
3 / 2 # 1.5 – division flottante
3 // 2 # 1 – division entière (quotient)
3 % 2 # 1 – modulo (reste)
3 ** 2 # 9 – puissance (3²)
2e3 # 2000.0 – notation scientifique (2 × 10³)
Piège : 2e3 n’est pas 2 * 3 mais la notation scientifique $2 \times 10^3 = 2000.0$, toujours de type float.
3.2 Calcul de moyennes
Calculez la moyenne de chacune des séries de nombres suivantes : 2 et 4 ; puis 4, 8 et 9 ; puis 12, 14/6 et 15.
Indice
La moyenne est la somme des valeurs divisée par leur nombre : les parenthèses comptent, comme dans (2 + 4) / 2.
Correction
m1 = (2 + 4) / 2
print(m1) # 3.0
m2 = (4 + 8 + 9) / 3
print(m2) # 7.0
m3 = (12 + 14/6 + 15) / 3
print(m3) # 9.777...
Attention : dans le dernier cas, 14/6 est une division Python (≈ 2.333), pas la fraction $\frac{14}{6}$ simplifiée. Les parenthèses autour du numérateur sont indispensables.
3.3 Volume d’une sphère
Le volume d’une sphère est donné par la formule $V = \frac{4}{3} \pi r^3$.
Calculer le volume d’une sphère de rayon 5.
Indication : pour obtenir la valeur de $\pi$, écrire from math import pi.
Indice
Définir d’abord r = 5, puis traduire la formule avec les opérateurs *, / et **.
Correction
from math import pi
r = 5
volume = (4/3) * pi * r ** 3
print(round(volume, 2)) # 523.6
Piège fréquent : écrire 4/3 * pi * r**3 fonctionne grâce à la priorité des opérations (la puissance est évaluée avant la multiplication et la division), mais les parenthèses rendent l’intention plus claire.
3.4 Test de parité
À l’aide de l’opérateur modulo %, testez la parité de chacun des nombres suivants : 1 ; 5 ; 20 ; 60/7.
Indication : le reste de la division de x par 2 est égal à zéro quand x est pair.
Indice
Pour 60/7, le quotient n’est pas un nombre entier : la parité a-t-elle un sens pour lui ?
Correction
print(1 % 2) # 1 → impair
print(5 % 2) # 1 → impair
print(20 % 2) # 0 → pair
print(60/7 % 2) # 0.571... → ni pair ni impair !
Point important : 60/7 donne un flottant (≈ 8.571). Le modulo d’un flottant est défini mais n’a pas de sens pour tester la parité, qui ne concerne que les entiers.
3.5 Comparaisons chaînées
Trouvez des valeurs x et y telles que l’expression x < 1/3 < y soit vraie (renvoie True).
Indice
Afficher d’abord la valeur de 1/3, puis choisir x un peu plus petit et y un peu plus grand.
Correction
x = 0
y = 1
print(x < 1/3 < y) # True
Python permet les comparaisons chaînées : x < 1/3 < y est équivalent à x < 1/3 and 1/3 < y. Il suffit que x soit inférieur à $\frac{1}{3} \approx 0.333$ et y supérieur.
Autre solution : x = 0.3 et y = 0.4.
Exercice 4 : chaînes de caractères – manipulations de base
4.1 Recherche d’un caractère
Écrire un programme qui demande à l’utilisateur de saisir une chaîne de caractères c et lui renvoie un message indiquant si la chaîne contient la lettre 'p' tout en indiquant sa position. Par exemple, si l’utilisateur entre "poire", le programme affiche : « le caractère ‘p’ se trouve à la position 0 ».
Indication : la méthode find() renvoie la position de la première occurrence d’un caractère, ou -1 s’il n’est pas trouvé.
Indice
Ranger le résultat de c.find('p') dans une variable, puis distinguer les deux cas avec un if.
Correction
c = input("Saisir une chaîne : ")
pos = c.find('p')
if pos != -1:
print(f"Le caractère 'p' se trouve à la position {pos} dans la chaîne")
else:
print("Le caractère 'p' n'est pas dans la chaîne")
Variante avec in :
c = input("Saisir une chaîne : ")
if 'p' in c:
print(f"Le caractère 'p' se trouve à la position {c.find('p')}")
else:
print("Le caractère 'p' n'est pas dans la chaîne")
4.2 Longueur et échange de caractères
Écrire un programme qui :
- demande à l’utilisateur de saisir une chaîne de caractères
c; - affiche le nombre de caractères de cette chaîne ;
- échange le premier et le dernier caractère de cette chaîne.
Indice
Une chaîne ne se modifie pas : construire une nouvelle chaîne avec le dernier caractère c[-1], puis les caractères du milieu, ajoutés un à un par une boucle, et enfin le premier caractère c[0].
Code à copier puis compléter
c = input("Saisir une chaîne : ")
print(f"Longueur : {len(c)} caractères")
milieu = ""
for i in range(1, len(c) - 1):
milieu = ...
nouvelle = ...
print(f"Après échange : {nouvelle}")
Correction
c = input("Saisir une chaîne : ")
print(f"Longueur : {len(c)} caractères")
# Les chaînes sont immuables : on construit une nouvelle chaîne
milieu = ""
for i in range(1, len(c) - 1):
milieu = milieu + c[i]
nouvelle = c[-1] + milieu + c[0]
print(f"Après échange : {nouvelle}")
Trace pour c = "python" :
c[-1]→"n"(dernier caractère)milieu→"ytho"(les caractères d’indice 1 à 4, ajoutés un à un par la boucle)c[0]→"p"(premier caractère)- Résultat :
"nythop"
4.3 Comparaison de longueurs
Écrire un programme qui compare la longueur de deux chaînes de caractères saisies par l’utilisateur et affiche un message adapté à chaque cas.
Indice
len donne la longueur de chaque chaîne ; trois cas à distinguer avec if, elif et else.
Correction
c1 = input("Première chaîne : ")
c2 = input("Deuxième chaîne : ")
if len(c1) > len(c2):
print(f"'{c1}' est plus longue ({len(c1)} contre {len(c2)})")
elif len(c1) < len(c2):
print(f"'{c2}' est plus longue ({len(c2)} contre {len(c1)})")
else:
print(f"Les deux chaînes ont la même longueur ({len(c1)})")
4.4 Insertion de virgules
Soit la chaîne c = "abcdef". Insérer le caractère "," entre chaque caractère de la chaîne c.
Résultat attendu : "a,b,c,d,e,f"
Indice
Partir du premier caractère, puis, pour chacun des suivants, ajouter une virgule et ce caractère.
Correction
c = "abcdef"
resultat = c[0]
for i in range(1, len(c)):
resultat = resultat + "," + c[i]
print(resultat) # "a,b,c,d,e,f"
On part du premier caractère, puis on ajoute, pour chacun des suivants, une virgule et le caractère. Le chapitre Listes présente la méthode join(), qui fait ce travail en une seule instruction.
Exercice 5 : chaînes de caractères – fonctions natives et méthodes
5.1 Longueur et transformation
Initialisez la variable s en lui affectant la chaîne "abc".
Utilisez une fonction native de Python pour déterminer sa longueur.
Écrivez une séquence d’opérations qui permet de transformer
"abc"en"aaabbbccc".Indice
L’opérateur
*répète une chaîne :"a" * 3vaut"aaa". Parcourirscaractère par caractère et accumuler le résultat dans une nouvelle chaîne.
Correction
s = "abc"
# 1. Longueur
print(len(s)) # 3
# 2. Transformation en "aaabbbccc"
resultat = ""
for caractere in s:
resultat = resultat + caractere * 3
print(resultat) # "aaabbbccc"
Explication : on parcourt chaque caractère de s et on le répète trois fois grâce à l’opérateur *. La concaténation accumule le résultat.
5.2 Recherche et remplacement
Initialisez la variable s en lui affectant la chaîne "aaabbbccc".
Utilisez une méthode pour trouver la première occurrence de
"b"puis la première occurrence de"ccc".Indice
La méthode
findde l’exercice 4.1 accepte aussi une chaîne de plusieurs caractères.Utilisez une méthode pour remplacer tous les
"a"par des"X", puis pour ne remplacer que le premier"a"par"X".
Indication : la méthode replace() accepte un troisième argument facultatif ; s.replace(a, b, n) ne remplace que les n premières occurrences de a.
Correction
s = "aaabbbccc"
# 1. Recherche
print(s.find("b")) # 3 (première occurrence de "b")
print(s.find("ccc")) # 6 (première occurrence de "ccc")
# 2. Remplacement
print(s.replace("a", "X")) # "XXXbbbccc" (tous les "a")
print(s.replace("a", "X", 1)) # "Xaabbbccc" (seulement le premier)
Point important : replace() ne modifie pas la chaîne originale (les chaînes sont immuables), elle renvoie une nouvelle chaîne. Le troisième argument optionnel limite le nombre de remplacements.
5.3 Changement de casse
Transformez la chaîne "aaa bbb ccc" en chacune des chaînes suivantes :
"AAA BBB CCC""AAA bbb CCC"
Indice
Chercher dans le cours la méthode qui met une chaîne en majuscules. Pour la seconde chaîne, appliquer replace aux seuls mots à changer : chaque appel renvoie une nouvelle chaîne, à laquelle on peut appliquer un autre replace.
Correction
s = "aaa bbb ccc"
# 1. Tout en majuscules
print(s.upper()) # "AAA BBB CCC"
# 2. Seulement "aaa" et "ccc" en majuscules
resultat = s.replace("aaa", "AAA").replace("ccc", "CCC")
print(resultat) # "AAA bbb CCC"
Chaque appel à replace() renvoie une nouvelle chaîne, sur laquelle on applique le remplacement suivant.