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 est écrit ci-dessous.
Soyez très attentifs aux paramètres de la fonction range() :
for i in range(1, 11) :
instruction1
instruction2
instruction3
Usage usuel du for
Pour retrouver l'usage habituel d'une boucle for,
on parcourt les entiers générés à l'aide de la fonction
range().
Lorsqu'on affiche l'aide sur range(), voici ce qu'on
obtient :
>>> help(range)
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 les programmes ci-dessous.
Il ne faut pas hésiter à modifier les valeurs des entiers situés
entre les parenthéses de la fonction range()
puis à ré-exécuter le programme.
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 (beaucoup) plus loin
Problématique
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.
Explications
En Python, l'instruction
range(1, 30) génère la « liste » 1,
2, 3, ..., 29.
La variable k de cette boucle prendra successivement pour
valeur chacun des entiers de cette liste.
Puis, 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 à :
Si bien que notre boucle
se comporte comme :
En Javascript, cela donne :
Un code Javascript
plus proche du code Python serait :
ou plus proche encore :
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
séparées par des virgules et délimitées par des crochets - On se limitera au lycée à
des valeurs de même type) :
Des informations complémentaires sur les listes seront données dans
le niveau 2 de la formation.
for et tuple
En Python, la boucle for permet
de parcourir un à un les éléments d'un tuple (p-uplets de valeurs
séparées par des virgules et délimitées par des parenthèses - On se limitera au lycée à
des valeurs de même type) :
La différence entre liste et tuple est aussi abordée dans
le niveau 2 de la formation.