Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

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

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()

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

Exercice : comptons!

### BEGIN SOLUTION
for i in range(0, 21, 2):
    print(i)
### END SOLUTION
0
2
4
6
8
10
12
14
16
18
20

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

from laby.global_fr import *

Laby("counting-the-rocks")
### 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()
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

Exercices supplémentaires

import glob, os
from jupylates import Exerciser

os.chdir("../exercices")
Exerciser(glob.glob("boucles-for/*"), mode="train")

Bilan