Mathématiques · 2nde

Python : variables, boucles, fonctions

Tu stresses car tu n'as jamais touché à Python de ta vie et le contrôle est demain. Pas de panique, on va repartir des toutes premières briques pour que tu puisses lire et comprendre un petit programme. Les prérequis sont simples : savoir ce qu'est une instruction (une ligne que l'ordinateur exécute), connaître les 4 opérations de base, et comprendre l'idée d'un calcul pas à pas. On attaque.

Le B.A.-BA en deux minutes

Variable : imagine une boîte avec une étiquette. L'étiquette, c'est le nom (souvent une lettre, comme $x$ en maths). Dans la boîte, tu ranges un nombre. L'instruction a = 5 signifie : « je mets la valeur $5$ dans la boîte nommée $a$ ».

Boucle : répéter une tâche. Python propose for (pour un nombre connu de tours) et while (pour répéter tant qu'une condition est vraie).

Fonction : une mini-machine. Tu lui donnes une valeur, elle te rend un résultat. En maths, une fonction fait ça : $f(3) = 9$. En Python, def la crée, return donne le résultat.

Ta première variable

Trace à la main ce qu'il se passe :

a = 10
b = 3
a = a + b

Ligne 1 : $a$ contient $10$.
Ligne 2 : $b$ contient $3$.
Ligne 3 : on lit l'ancien $a$ ($10$), on ajoute $b$ ($3$), et on remplace ce qu'il y a dans $a$ par le nouveau total ($13$).

Écrire a = a + b veut bien dire : la nouvelle valeur de $a$ égale l'ancienne valeur de $a$ plus $b$. Ce n'est pas une équation, c'est une affectation.

À toi de jouer

1. On exécute ces instructions dans l'ordre. Complète l'état des variables. C'est toi qui joues le robot : lis une ligne, mets à jour les boîtes, passe à la ligne suivante.
a = 5
b = 2
a = a + b
b = a - b
c = a * b
Après ligne 1 : $a = \underline{\hspace{1.1em}}$, $b$ n'existe pas, $c$ n'existe pas. Après ligne 2 : $a = 5$, $b = \underline{\hspace{1.1em}}$. Après ligne 3 (a = 5 + 2) : $a = \underline{\hspace{1.1em}}$, $b = 2$. Après ligne 4 (b = 7 - 2) : $a = 7$, $b = \underline{\hspace{1.1em}}$. Après ligne 5 (c = 7 × 5) : $a = 7$, $b = 5$, $c = \underline{\hspace{1.1em}}$.
Corrigé
Après ligne 1 : $a = 5$, $b$ n'existe pas, $c$ n'existe pas. Après ligne 2 : $a = 5$, $b = 2$. Après ligne 3 (a = 5 + 2) : $a = 7$, $b = 2$. Après ligne 4 (b = 7 - 2) : $a = 7$, $b = 5$. Après ligne 5 (c = 7 × 5) : $a = 7$, $b = 5$, $c = 35$.
2. Voici une boucle for très simple. On lit ensemble : range(1,4) donne les entiers $1$, $2$, $3$ (on s'arrête avant $4$). $s$ est un accumulateur.
s = 0
for i in range(1,4):
    s = s + i
Complète le tableau. Tour 1 : $i$ prend la valeur $\underline{\hspace{1.1em}}$, $s$ devient $0 + \underline{\hspace{1.1em}} = \underline{\hspace{1.1em}}$. Tour 2 : $i = \underline{\hspace{1.1em}}$, $s$ devient $1 + \underline{\hspace{1.1em}} = 3$. Tour 3 : $i = \underline{\hspace{1.1em}}$, $s$ devient $3 + \underline{\hspace{1.1em}} = \underline{\hspace{1.1em}}$. À l'arrêt, $s$ vaut $\underline{\hspace{1.1em}}$.
Corrigé
Tour 1 : $i = 1$, $s$ devient $0 + 1 = 1$. Tour 2 : $i = 2$, $s$ devient $1 + 2 = 3$. Tour 3 : $i = 3$, $s$ devient $3 + 3 = 6$. À l'arrêt, $s$ vaut $6$.
3. On te donne un modèle de fonction. Que renvoie-t-elle ?
def double(x):
    return x * 2
Pour double(3), le paramètre $x$ prend $3$, le return envoie $\underline{\hspace{1.1em}} \times \underline{\hspace{1.1em}} = \underline{\hspace{1.1em}}$. Pour double(7), $x$ prend $7$, le return envoie $\underline{\hspace{1.1em}}$.
Corrigé
Pour double(3), le paramètre $x$ prend $3$, le return envoie $3 \times 2 = 6$. Pour double(7), $x$ prend $7$, le return envoie $14$.

Ah, tu as déjà entrevu <code>a = 5</code> ou <code>for</code> quelque part. On va remettre tout à plat proprement, avec la méthode pas-à-pas pour chaque bloc : variable, boucle <code>for</code>, boucle <code>while</code> et fonction. L'objectif : que tu saches lire un programme simple et écrire une petite fonction.

Les trois piliers, structurés

1. Variable et affectation : nom = valeur. Ce qui est à droite est évalué (calculé), puis rangé dans la variable de gauche. Exemple : a = a + 1 signifie « prends l'ancien $a$, ajoute $1$, mets le résultat dans $a$. »

2. Boucle for : for i in range(debut, fin): — le bloc indenté est répété pour $i$ allant de debut à fin - 1. range(n) seul commence à $0$ et s'arrête à $n-1$.

3. Boucle while : while condition: — tant que la condition est vraie, le bloc indenté tourne. Attention : si la condition reste toujours vraie, la boucle est infinie.

4. Fonction : def nom(parametre): — voir la méthode ci-dessous.

Méthode : écrire une fonction en Python

  1. Écrire def suivi du nom de la fonction, puis parenthèses avec les paramètres, puis deux-points :.
  2. À la ligne, indenter (4 espaces, ou une tabulation).
  3. Écrire le corps de la fonction (calculs, boucles...).
  4. Terminer par return suivi de ce que la fonction doit renvoyer.
  5. Tester avec une valeur simple pour vérifier à la main.

Piège : return arrête la fonction et renvoie la valeur. Ce qui est écrit après return dans le même bloc n'est pas exécuté.
Autre piège : l'affectation = n'est pas l'égalité testée ==. Dans un if, on teste avec ==.

À toi de jouer

1. On exécute ce programme ligne par ligne. Remplis les trous avec l'état de $a$ et $b$ après chaque instruction.
a = 4
b = 7
a = a + b
b = a - b
a = a - b
Après ligne 1 : $a = \underline{\hspace{1.1em}}$, $b$ non défini. Après ligne 2 : $a = 4$, $b = \underline{\hspace{1.1em}}$. Après ligne 3 : $a = 4 + 7 = \underline{\hspace{1.1em}}$, $b$ ne change pas, il vaut $7$. Après ligne 4 : $b = 11 - 7 = \underline{\hspace{1.1em}}$, $a$ ne change pas, il vaut $11$. Après ligne 5 : $a = 11 - 4 = \underline{\hspace{1.1em}}$, $b$ ne change pas, il vaut $4$. Que remarques-tu sur les valeurs de $a$ et $b$ avant et après ce bloc ?
Corrigé
Après ligne 1 : $a = 4$, $b$ non défini. Après ligne 2 : $a = 4$, $b = 7$. Après ligne 3 : $a = 4 + 7 = 11$, $b$ ne change pas, il vaut $7$. Après ligne 4 : $b = 11 - 7 = 4$, $a$ ne change pas, il vaut $11$. Après ligne 5 : $a = 11 - 4 = 7$, $b$ ne change pas, il vaut $4$. Remarque : $a$ qui valait $4$ vaut maintenant $7$, $b$ qui valait $7$ vaut maintenant $4$. Le bloc a échangé les valeurs des deux variables (sans utiliser de variable temporaire explicite, même si Python l'a fait en interne).
2. Complète cette boucle for qui calcule $3 + 6 + 9 + 12$ en utilisant un accumulateur $s$.
s = 
for k in range(, , ):
    s = s + k
Indice : range(début, fin, pas) permet d'avancer de pas en pas. Ici, on veut les multiples de $3$ de $3$ jusqu'à $12$ inclus. range(3, 13, 3) donne $3, 6, 9, 12$. Déroule ensuite le calcul à la main : tour 1, $k = 3$, $s = 0 + 3 = 3$ ; tour 2, $k = 6$, $s = \underline{\hspace{1.1em}} + \underline{\hspace{1.1em}} = \underline{\hspace{1.1em}}$ ; tour 3, $k = 9$, $s = \underline{\hspace{1.1em}}$ ; tour 4, $k = 12$, $s = \underline{\hspace{1.1em}}$. Résultat final affiché : $s = \underline{\hspace{1.1em}}$.
Corrigé
s = 0
for k in range(3, 13, 3):
    s = s + k
Déroulé : tour 1, $k = 3$, $s = 0 + 3 = 3$ ; tour 2, $k = 6$, $s = 3 + 6 = 9$ ; tour 3, $k = 9$, $s = 9 + 9 = 18$ ; tour 4, $k = 12$, $s = 18 + 12 = 30$. Résultat final : $s = 30$.
3. On veut la plus petite puissance de $2$ strictement supérieure à $50$. On utilise une boucle while. Complète la condition et remplis le tableau d'itérations.
n = 1
while n <= 50:
    n = n * 2
print(n)
Avant la boucle : $n = 1$. La condition n <= 50 est vraie, donc on entre. Tour 1 : $n = 1 \times 2 = \underline{\hspace{1.1em}}$. Condition 2 <= 50 vraie. Tour 2 : $n = 2 \times 2 = \underline{\hspace{1.1em}}$. Condition <= 50 vraie. Tour 3 : $n = 4 \times 2 = \underline{\hspace{1.1em}}$. Condition vraie. Tour 4 : $n = 8 \times 2 = \underline{\hspace{1.1em}}$. Condition vraie. Tour 5 : $n = 16 \times 2 = \underline{\hspace{1.1em}}$. Condition vraie. Tour 6 : $n = 32 \times 2 = \underline{\hspace{1.1em}}$. Condition 64 <= 50 fausse : on sort. La valeur affichée est $\underline{\hspace{1.1em}}$.
Corrigé
Tour 1 : $n = 1 \times 2 = 2$. Condition 2 <= 50 vraie. Tour 2 : $n = 2 \times 2 = 4$. Condition 4 <= 50 vraie. Tour 3 : $n = 4 \times 2 = 8$. Condition vraie. Tour 4 : $n = 8 \times 2 = 16$. Condition vraie. Tour 5 : $n = 16 \times 2 = 32$. Condition vraie. Tour 6 : $n = 32 \times 2 = 64$. Condition 64 <= 50 fausse : on sort. La valeur affichée est $64$.
4. Écris une fonction prix_ttc(ht) qui prend un prix hors taxe et renvoie le prix TTC avec une TVA à 20 %. Le squelette est donné, complète les trous.
def prix_ttc(ht):
    return ht * 
Vérification : prix_ttc(100) doit renvoyer $\underline{\hspace{1.1em}}$.
Corrigé
def prix_ttc(ht):
    return ht * 1.20
Vérification : prix_ttc(100) doit renvoyer $120.0$ (ou $120$ selon l'affichage).

Cinq exercices quasi identiques pour que le geste devienne un réflexe. Trace des variables, déroule des boucles simples, écris une fonction basique. Prends ton temps, la réussite est garantie.

À toi de jouer

1. Quelles sont les valeurs finales de $x$, $y$, $z$ après ce bloc ?
x = 10
y = 3
x = x + y
y = x - y
z = x * y
Complète : $x = 10 + 3 = \underline{\hspace{1.1em}}$ ; $y = 13 - 3 = \underline{\hspace{1.1em}}$ ; $z = 13 \times 10 = \underline{\hspace{1.1em}}$. Réponse finale : $x = \underline{\hspace{1.1em}}$, $y = \underline{\hspace{1.1em}}$, $z = \underline{\hspace{1.1em}}$.
Corrigé
$x = 10 + 3 = 13$ ; $y = 13 - 3 = 10$ ; $z = 13 \times 10 = 130$. Réponse finale : $x = 13$, $y = 10$, $z = 130$.
2. Quelles sont les valeurs finales de $a$, $b$, $c$ après ce bloc ?
a = 7
b = 5
a = a + b
b = a - b
c = a * b
Complète : $a = 7 + 5 = \underline{\hspace{1.1em}}$ ; $b = 12 - 5 = \underline{\hspace{1.1em}}$ ; $c = 12 \times 7 = \underline{\hspace{1.1em}}$. Réponse finale : $a = \underline{\hspace{1.1em}}$, $b = \underline{\hspace{1.1em}}$, $c = \underline{\hspace{1.1em}}$.
Corrigé
$a = 7 + 5 = 12$ ; $b = 12 - 5 = 7$ ; $c = 12 \times 7 = 84$. Réponse finale : $a = 12$, $b = 7$, $c = 84$.
3. Quelle est la valeur affichée par la boucle suivante ?
s = 0
for i in range(1, 5):
    s = s + i
print(s)
range(1, 5) donne $1, 2, 3, 4$. Tour 1 : $s = 0 + 1 = \underline{\hspace{1.1em}}$. Tour 2 : $s = 1 + 2 = \underline{\hspace{1.1em}}$. Tour 3 : $s = \underline{\hspace{1.1em}}$. Tour 4 : $s = \underline{\hspace{1.1em}}$. Valeur affichée : $\underline{\hspace{1.1em}}$.
Corrigé
Tour 1 : $s = 0 + 1 = 1$. Tour 2 : $s = 1 + 2 = 3$. Tour 3 : $s = 3 + 3 = 6$. Tour 4 : $s = 6 + 4 = 10$. Valeur affichée : $10$.
4. Quelle est la valeur affichée par la boucle suivante ?
n = 1
while n < 30:
    n = n * 2
print(n)
Tour 1 : $n = 1 \times 2 = \underline{\hspace{1.1em}}$ ; tour 2 : $n = 2 \times 2 = \underline{\hspace{1.1em}}$ ; tour 3 : $n = 4 \times 2 = \underline{\hspace{1.1em}}$ ; tour 4 : $n = 8 \times 2 = \underline{\hspace{1.1em}}$ ; tour 5 : $n = 16 \times 2 = \underline{\hspace{1.1em}}$ (condition 32 < 30 fausse, on sort). Valeur affichée : $\underline{\hspace{1.1em}}$.
Corrigé
Tour 1 : $n = 1 \times 2 = 2$ ; tour 2 : $n = 2 \times 2 = 4$ ; tour 3 : $n = 4 \times 2 = 8$ ; tour 4 : $n = 8 \times 2 = 16$ ; tour 5 : $n = 16 \times 2 = 32$ (condition 32 < 30 fausse, on sort). Valeur affichée : $32$.
5. Écris une fonction triple(x) qui renvoie le triple de $x$.
def triple(x):
    return x * 
Vérifie : triple(6) doit renvoyer $\underline{\hspace{1.1em}}$.
Corrigé
def triple(x):
    return x * 3
Vérifie : triple(6) doit renvoyer $18$.

Maintenant on enchaîne avec des exercices qui ressemblent à ce que tu auras en contrôle ou au brevet : tracer des variables plus complexes, lire et comprendre des boucles, écrire des fonctions avec un peu de logique (pair/impair, valeur absolue). Tu vas y arriver.

À toi de jouer

1. Donne la valeur finale de chaque variable après exécution complète de ce programme. Raisonne ligne par ligne sans utiliser Python.
a = 12
b = 8
c = a
a = b
b = c
c = a + b
1. Quel est le rôle des trois premières lignes après l'affectation de $c$ ? 2. Quelle est la valeur finale de $a$ ? 3. Quelle est la valeur finale de $b$ ? 4. Quelle est la valeur finale de $c$ ?
Corrigé
1. Les lignes c = a; a = b; b = c échangent les valeurs de $a$ et $b$ en utilisant $c$ comme variable temporaire. Avant l'échange, $a=12$, $b=8$. Après, $a$ reçoit $8$ (valeur de $b$) et $b$ reçoit $12$ (valeur de $a$, conservée dans $c$). 2. $a = 8$. 3. $b = 12$. 4. $c = a + b = 8 + 12 = 20$.
2. On exécute la boucle suivante.
s = 0
for i in range(2, 7):
    s = s + i
print(s)
Donne les valeurs successives prises par $i$, puis dresse un tableau donnant la valeur de $s$ à chaque tour. Quelle est la valeur affichée ?
Corrigé
$i$ prend les valeurs $2, 3, 4, 5, 6$. Tableau : $i=2$ : $s = 0 + 2 = 2$ $i=3$ : $s = 2 + 3 = 5$ $i=4$ : $s = 5 + 4 = 9$ $i=5$ : $s = 9 + 5 = 14$ $i=6$ : $s = 14 + 6 = 20$ Valeur affichée : $20$.
3. On veut afficher la plus petite puissance de $3$ strictement supérieure à $80$. Écris en Python un programme qui utilise une boucle while. Donne la valeur affichée et justifie que c'est bien une puissance de $3$ strictement supérieure à $80$.
Corrigé

Pour résoudre ce problème, tu peux utiliser le programme suivant :

n = 1
while n <= 80:
    n = n * 3
print(n)

Détaillons le déroulement de la boucle :
- Au départ, $n$ vaut $1$.
- La condition $1 \le 80$ est vraie, donc $n$ prend la valeur $1 \times 3 = 3$.
- La condition $3 \le 80$ est vraie, donc $n$ prend la valeur $3 \times 3 = 9$.
- La condition $9 \le 80$ est vraie, donc $n$ prend la valeur $9 \times 3 = 27$.
- La condition $27 \le 80$ est vraie, donc $n$ prend la valeur $27 \times 3 = 81$.
- La condition $81 \le 80$ est fausse. La boucle s'arrête et le programme affiche la valeur de $n$.

La valeur affichée est donc $81$.

Justification :
$81 = 3^4$, c'est bien une puissance de $3$ strictement supérieure à $80$. De plus, la puissance de $3$ précédente est $3^3 = 27$, qui est inférieure ou égale à $80$. Ainsi, $81$ est bien la plus petite puissance de $3$ strictement supérieure à $80$.

4. Écris en Python une fonction est_pair(n) qui renvoie True si $n$ est pair, False sinon. L'opérateur modulo s'écrit %. Indice : un nombre est pair si le reste de sa division par $2$ vaut $0$. Teste mentalement : est_pair(14) doit renvoyer True, est_pair(9) doit renvoyer False.
Corrigé
def est_pair(n):
    return n % 2 == 0
Vérification : n % 2 calcule le reste de la division euclidienne de $n$ par $2$. 14 % 2 donne $0$, donc True. 9 % 2 donne $1$, donc False.
5. Écris en Python une fonction valeur_absolue(x) qui renvoie $|x|$ sans utiliser la fonction intégrée abs(). Utilise un if / else. Rappel : $|x| = x$ si $x \ge 0$, sinon $|x| = -x$.
Corrigé
def valeur_absolue(x):
    if x >= 0:
        return x
    else:
        return -x
Exemples : valeur_absolue(5) renvoie $5$, valeur_absolue(-7) renvoie $7$.
6. Écris une fonction somme_carres(n) qui calcule la somme des carrés des entiers de $1$ à $n$ : $1^2 + 2^2 + \ldots + n^2$. Exemple : somme_carres(3) doit renvoyer $1 + 4 + 9 = 14$. Utilise une boucle for et un accumulateur.
Corrigé
def somme_carres(n):
    s = 0
    for i in range(1, n+1):
        s = s + i * i
    return s
Pour $n=3$ : $i=1$, $s = 0+1 = 1$ ; $i=2$, $s = 1+4 = 5$ ; $i=3$, $s = 5+9 = 14$. Renvoie $14$.

Ces exercices vont un cran plus loin pour te préparer à la Première : on réfléchit sur les invariants de boucle, on compare l'efficacité de deux approches (boucle contre formule), et on écrit une fonction un peu plus construite avec plusieurs paramètres. Tu vas manipuler les notions du programme avec plus de recul.

À toi de jouer

1. On considère la fonction mystère ci-dessous. Sans utiliser Python, que renvoie mystere(2, 5) ? Détaille chaque itération, puis exprime en une phrase ce que fait cette fonction pour des entiers positifs.
def mystere(a, b):
    resultat = 1
    for i in range(b):
        resultat = resultat * a
    return resultat
Corrigé
Pour mystere(2, 5) : Avant la boucle : resultat = 1. Tour 1 : resultat = 1 * 2 = 2. Tour 2 : resultat = 2 * 2 = 4. Tour 3 : resultat = 4 * 2 = 8. Tour 4 : resultat = 8 * 2 = 16. Tour 5 : resultat = 16 * 2 = 32. Valeur renvoyée : $32$. Interprétation : la fonction calcule $a^b$ (exponentiation entière) pour $b$ positif. Ici, $2^5 = 32$.
2. La somme des $n$ premiers entiers peut se calculer avec une boucle (méthode 1) ou avec la formule $\dfrac{n(n+1)}{2}$ (méthode 2). 1. Écris une fonction somme_boucle(n) qui utilise une boucle for. 2. Écris une fonction somme_formule(n) qui utilise la formule sans boucle. 3. Laquelle des deux méthodes est la plus efficace si $n$ est très grand (par exemple $n = 10^7$) ? Pourquoi ? Vérifie que les deux fonctions donnent le même résultat pour $n = 100$.
Corrigé
1.
def somme_boucle(n):
    s = 0
    for i in range(1, n+1):
        s = s + i
    return s
2.
def somme_formule(n):
    return n * (n + 1) // 2
3. La méthode formule est bien plus efficace pour $n$ grand. La boucle nécessite $n$ additions : pour $n = 10^7$, cela prend environ $10$ millions d'opérations. La formule ne nécessite qu'une addition, une multiplication et une division : $3$ opérations, quel que soit $n$. Elle est en temps constant, là où la boucle est en temps proportionnel à $n$. Vérification pour $n = 100$ : $1+2+\ldots+100 = 5050$. somme_boucle(100) renvoie $5050$ ; somme_formule(100) renvoie $100 \times 101 // 2 = 5050$.
3. En Première, tu verras les listes en Python. On peut dès maintenant écrire une fonction qui construit la suite de Syracuse (ou conjecture de Collatz) d'un entier $n$. Règle : si $n$ est pair, on le divise par $2$ ; si $n$ est impair, on le multiplie par $3$ et on ajoute $1$. On s'arrête quand $n$ vaut $1$. Écris une fonction syracuse(n) qui renvoie le nombre d'étapes pour atteindre $1$ en partant de $n$. Utilise une boucle while. Exemple : pour $n = 6$, le chemin est $6 \to 3 \to 10 \to 5 \to 16 \to 8 \to 4 \to 2 \to 1$, soit $8$ étapes. Indice : utilise un compteur initialisé à $0$ et incrémenté à chaque transformation.
Corrigé
def syracuse(n):
    compteur = 0
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        compteur = compteur + 1
    return compteur
Vérification pour $n = 6$ : $6$ pair, $6//2 = 3$ (1 étape) ; $3$ impair, $3*3+1 = 10$ (2) ; $10$ pair, $5$ (3) ; $5$ impair, $16$ (4) ; $16$ pair, $8$ (5) ; $8$ pair, $4$ (6) ; $4$ pair, $2$ (7) ; $2$ pair, $1$ (8). On sort car $n=1$. Renvoie $8$.
Besoin d'aide ? Nous contacter
Dans la même catégorie : Algorithmes de recherche et tri · Colinéarité et déterminant · Développer et factoriser · Ensembles de nombres · Fonctions de référence · Généralités sur les fonctions

Fiche gratuite créée par Vidyalaya, association d'éducation populaire — soutien scolaire, FLE & DELF, libre et gratuit pour tous.
Tu bloques encore ? Écris-nous, on t'aide gratuitement : contact@vidyalaya.fr.

Fiche librement réutilisable sous licence CC BY-SA 4.0 — copiez, imprimez, adaptez, en citant Vidyalaya et en conservant la même licence.