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.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 : 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")
  1. 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 ?

  2. Qu’affiche le programme ? Vérifier dans Thonny.

  3. 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 ?

  4. 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 :

  • heures vaut 3725 // 3600, soit 1 ;
  • reste vaut 3725 % 3600, soit 125 ;
  • minutes vaut 125 // 60, soit 2 ;
  • secondes vaut 125 % 60, soit 5.

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".

  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".

    Indice

    L’opérateur * répète une chaîne : "a" * 3 vaut "aaa". Parcourir s caractè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".

  1. Utilisez une méthode pour trouver la première occurrence de "b" puis la première occurrence de "ccc".

    Indice

    La méthode find de l’exercice 4.1 accepte aussi une chaîne de plusieurs caractères.

  2. 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 :

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