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.5 est le résultat de 7 / 2 (division flottante). Confusion entre / et //.
  • C est faux : 1 est le résultat de 7 % 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 : 6 est le résultat de 2 * 3 (multiplication). Confusion entre ** et *.
  • C est faux : 5 est le résultat de 2 + 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 : 3 est le quotient (10 // 3), pas le reste.
  • B est faux : 3.33... est le résultat de 10 / 3. Confusion entre / et %.
  • D est faux : 0 serait le résultat de 9 % 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".

  1. Utilisez une fonction native de Python pour déterminer sa longueur.
  2. É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".

  1. Utilisez une méthode pour trouver la première occurrence de "b" puis la première occurrence de "ccc".
  2. 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 :

  1. "AAA BBB CCC"
  2. "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"