03 - TD Python (2)
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 : exemple travaillé – opérateurs arithmétiques
Problème : à partir d’un nombre de secondes, extraire les heures, minutes et secondes restantes.
Étape 1. Identifier les opérateurs nécessaires :
//pour obtenir un quotient entier ;%pour obtenir un reste.
Étape 2. Appliquer les opérateurs :
total = 3725 # secondes
heures = total // 3600 # 3725 // 3600 = 1
reste = total % 3600 # 3725 % 3600 = 125
minutes = reste // 60 # 125 // 60 = 2
secondes = reste % 60 # 125 % 60 = 5
print(f"{heures}h {minutes}min {secondes}s") # 1h 2min 5s
Point clé : // et % forment un couple inséparable pour la décomposition de grandeurs (temps, monnaie, conversions de bases).
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.
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 suites de nombres suivantes : (2, 4) ; (4, 8, 9) ; (12, 14/6, 15).
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.
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.
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).
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é.
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.index('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.
Correction
c = input("Saisir une chaîne : ")
print(f"Longueur : {len(c)} caractères")
# Échange du premier et du dernier caractère
# Les chaînes sont immutables, on en construit une nouvelle
nouvelle = c[-1] + c[1:-1] + c[0]
print(f"Après échange : {nouvelle}")
Trace pour c = "python" :
c[-1]→"n"(dernier caractère)c[1:-1]→"ytho"(caractères du milieu)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.
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"
Correction
Méthode 1 – avec join() :
c = "abcdef"
resultat = ",".join(c)
print(resultat) # "a,b,c,d,e,f"
",".join(c) insère "," entre chaque caractère de c. C’est la méthode la plus concise.
Méthode 2 – avec une boucle :
c = "abcdef"
resultat = c[0]
for i in range(1, len(c)):
resultat = resultat + "," + c[i]
print(resultat) # "a,b,c,d,e,f"
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".
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". - Utilisez une méthode pour remplacer tous les
"a"par des"X", puis pour ne remplacer que le premier"a"par"X".
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 immutables), 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"
Correction
s = "aaa bbb ccc"
# 1. Tout en majuscules
print(s.upper()) # "AAA BBB CCC"
# 2. Seulement "aaa" et "ccc" en majuscules
mots = s.split() # ["aaa", "bbb", "ccc"]
mots[0] = mots[0].upper() # "AAA"
mots[2] = mots[2].upper() # "CCC"
print(" ".join(mots)) # "AAA bbb CCC"
Méthode alternative pour la question 2 :
s = "aaa bbb ccc"
resultat = s.replace("aaa", "AAA").replace("ccc", "CCC")
print(resultat) # "AAA bbb CCC"