Le langage Scratch a permis aux élèves de
rencontrer leur première structure de boucle itérative sous la forme d'une
répétition d'instructions. Cette répétition est généralement traduite par
un algorithme de la forme :
Pour i allant de 1 à 10:
instruction1
instruction2
instruction3
Un équivalent en Python de cette instruction Scratch :
for _ in range(10) :
instruction1
instruction2
instruction3
Parcours de séquences
boucle for et type string
En Python, la boucle for permet
de parcourir un à un les éléments d'une chaîne de caractères
(séquence de symboles délimitée par des guillemets " ou des
apostrophes '). Testez l'exemple ci-dessous :
for et liste
En Python, la boucle for permet
de parcourir un à un les éléments d'une liste (séquence de valeurs de
divers types séparées par des virgules et délimitées par des crochets) :
En Python, la boucle for permet
de parcourir un à un les éléments d'un tuple (séquence
de valeurs de divers types séparées par des virgules et délimitées par des
parenthèses) :
Pour retrouver l'usage habituel d'une boucle for, on parcourt de
même les entiers générés à l'aide de la fonction range().
Lorsqu'on affiche l'aide sur range() :
help(range)
voici ce qu'on obtient :
class range(object)
| range(stop) -> range object
| range(start, stop[, step]) -> range object
|
| Return an object that produces a sequence of integers from start (inclusive)
| to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
| start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
| These are exactly the valid indices for a list of 4 elements.
| When step is given, it specifies the increment (or decrement).
Pour bien comprendre ce que cela signifie et les entiers générés par la
fonction range(), exécutez le programme ci-dessous :
range(a, b, pas) génère les entiers a,
a+pas, a+2*pas, ... en s'arrêtant sur la plus
grande valeur de la forme a+k*pas qui soit strictement
inférieure à b.
range(a, b) est équivalent à range(a, b, 1) et
génère les entiers a, a+1, a+2, ...,
b-1.
range(b) est équivalent à range(0, b, 1)
et génère les entiers 0, 1, 2, ...,
b-1.
Conséquence
On peut alors facilement élaborer un exemple de boucle usuelle :
Pour aller plus loin
On montre ici une petite différence entre deux langages sur un script
"pathologique" mais inspiré d'une réponse d'élève à un
contrôle. Cet élève avait a priori "confondu" une boucle while
et une boucle for dans un exercice demandant de calculer une
somme : cela l'avait amené à incrémenter la variable de sa boucle for
dans le corps de la boucle.
Cette différence montre, s'il en est besoin, qu'il faut être rigoureux
dans la définition d'un pseudo-langage de présentation des algorithmes
(et surtout, ici, qu'il faut éviter les codes "pathologiques",
nécessairement ambigus).
Devinez quel sera le résultat de l'exécution du code ci-dessous :
Et maintenant, un code qui pourrait sembler a priori équivalent
en Javascript :
On voit donc qu'une simple boucle for est traitée différemment suivant
les langages.
En Python, l'indice k de la boucle parcourt
la « liste » 1, 2, 3, ..., 29.
Pour chaque valeur, k est incrémenté dans la première instruction du corps de la
boucle :
k prend la première valeur de la liste 1, 2, 3, ..., 29,
c'est à dire 1
puis k prend la valeur 4 avec l'instruction k += 3 du corps de la boucle et est enfin affiché.
A l'itération suivante :
k prend la valeur suivante dans la liste 1, 2, 3, ..., 29,
c'est à dire la valeur 2
puis k devient 5 avec l'instruction k += 3 du corps de la boucle et est affiché.
etc...
On peut mieux saisir le principe avec l'exemple suivant :
On voit avec cet exemple que l'indice k de la boucle n'est pas a priori incrémenté à chaque tour
de boucle : il prend successivement les différentes valeurs de
la liste.
Par contre la boucle for(let k = 1; k < 30; k++) instruction; du langage
Javascript (il en serait de même en langage C par exemple)
est équivalente à :