Les boucles for#

Motivation#

Revenons sur notre programme pour compter de 1 à 5 :

n = 1

while n <= 5:
    print(n)
    n = n + 1 
1
2
3
4
5

Il suit un schéma classique de programme avec un compteur :

    initialisation

    while condition:
        bloc d instructions
        incrémentation
    
  • L” initialisation (initialisation) n = 1 détermine à partir de quelle valeur on compte;

  • L” incrémentation (incrementation) n = n + 1 détermine par pas de combien on compte;

  • La condition (condition) n <= 5 détermine jusqu’à quelle valeur on compte.

Problème :

La gestion du compteur est dispersée : le lecteur doit chercher à trois endroits pour avoir toutes les informations sur le compteur. L’incrémentation notamment se retrouve loin si le bloc d’instructions est long.

Pour pallier cela, la plupart des langages de programmation introduisent la boucle for : «pour … de … à … faire …». Voici comment cela s’écrit en Python sur notre exemple :

for i in range(1, 6):
    print(i)
1
2
3
4
5

Litéralement cela se traduit par : « pour i dans la séquence de 1 à 6 exclu, afficher i ».

La fontion range()#

Définition : La fonction range()

La fonction range renvoie une séquence d’entiers. Elle est souvent utilisée dans les boucles pour répéter une action un certain nombre de fois. Elle peut-être utilisée sous trois formes :

  • range(fin) : génère une séquence d’entiers de 0 à fin exclu.

  • range(début, fin) : génère une séquence d’entiers de début à fin exclu.

  • range(début, fin, pas) : génère une séquence d’entiers de début à fin exclu, par pas de pas.

Note aux enseignants

À faire

Définir la syntaxe et la sémantique de la boucle for; peut—être après la première volée d’exemples

Voici quelques exemples d’utilisation de la fonction range() pour une boucle for :

  • Affiche les nombres de 0 à 4 :

for i in range(5):
    print(i) 
0
1
2
3
4
  • Affiche les nombres de 1 à 5 :

for i in range(1, 6):
    print(i) 
1
2
3
4
5
  • Affiche les nombres impairs (par pas de 2) entre 1 et 9 :

for i in range(1, 10, 2):
    print(i) 
1
3
5
7
9
  • Le pas peut également être négatif :

for i in range(5, 0, -1):
    print(i) 
5
4
3
2
1

Exercice : comptons!#

  • Copiez l’instruction for ci-dessous dans la cellule suivante, et remplacez les trois « ? » par les valeurs appropriées pour afficher les entiers pairs entre 0 et 20 (0,2,4,…,20) :

      for i in range(?, ?, ? ):
          print(i)
      
    
### BEGIN SOLUTION
for i in range(0, 21, 2):
    print(i)
### END SOLUTION
0
2
4
6
8
10
12
14
16
18
20
  • Écrivez des boucles for qui affichent les nombres suivants dans l’ordre donné :

0, 3, 6, 9, 12 :

### BEGIN SOLUTION
for i in range(0, 13, 3):
    print(i)
### END SOLUTION
0
3
6
9
12

20, 21, 22, 23, 24, 25 :

### BEGIN SOLUTION
for i in range(20, 26): 
    print(i)
### END SOLUTION
20
21
22
23
24
25

10, 9, 8, 7, 6, 5, 4, 3, 2, 1 :

### BEGIN SOLUTION
for i in range(10, 0, -1):
    print(i)
### END SOLUTION
10
9
8
7
6
5
4
3
2
1

Utilisation de la boucle for dans Laby#

  • Relevez le défi Laby ci-dessous si vous ne l’avez pas encore fait en Semaine 1 :

from laby.global_fr import *
Laby("counting-the-rocks")
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[11], line 1
----> 1 from laby.global_fr import *
      2 Laby("counting-the-rocks")

ModuleNotFoundError: No module named 'laby'
### BEGIN SOLUTION
# Prend le caillou qui est devant et le pose derrière
def deplace_caillou_derriere():
    prend()
    avance()
    gauche() 
    gauche()
    pose()
    gauche()
    gauche()
### END SOLUTION
debut()
### BEGIN SOLUTION
avance()
# Avance et pose les cailloux derrière (7 fois)
for i in range(0, 7):
	deplace_caillou_derriere()

# Tourne à gauche puis avance (2 fois)
for i in range(0,2):
    gauche()
    avance() 
    avance()

# Tourne à droite puis avance à travers les cailloux (4 fois)
droite()
for i in range(0,4):
	deplace_caillou_derriere()

# Tourne à droite puis avance à travers les cailloux (5 fois)
droite()
avance()
for i in range(0,5):
	deplace_caillou_derriere()

gauche()
avance() 
avance()
ouvre()
### END SOLUTION
assert est_gagnant()
  • ♣ Écrivez une fonction carre(L) qui prend en paramètre un entier L, et qui fait faire à la fourmi une trajectoire carrée de côté L cases. La fourmi doit revenir à la case de départ à la fin de la fonction.

Laby(carte=
"o o o o o o o o o o o o\n"
"o . . . . . . . . . . o\n"
"o . . . . . . . . . . o\n"
"o . . . . . . . . . . o\n"
"o . . . . . . . . . . o\n"
"o . . . . . . . . . . o\n"
"o . . . . . . . . . . o\n"
"o . . . . . . . . . . o\n"
"o . . . . . . . . . . o\n"
"o . . . . . . . . . . o\n"
"o ↑ . . . . . . . . . o\n"
"o o o o o o o o o o o o\n"
)
# Entrée : un entier L, correspondant à la longeur d'un côté de la trajectoire.
# Sortie : aucune, déplace la fourmi selon un carré de longueur L
### BEGIN SOLUTION
def carre(L) :
    if (L > 0):
        for i in range(4):
            for j in range(L-1):
                avance()
            droite()
### END SOLUTION
debut()
carre(0)  # La fourmi ne fait rien
debut()
carre(1)  # La fourmi doit faire un tour sur elle-même
debut()
carre(5)  # la fourmi doit parcourir un carré de longueur 5 cases

Bilan#

Astuce

À retenir Lorsque la boucle fait intervenir un compteur, on utilise généralement une boucle for et sinon une boucle while.

Retourner à l’index