Les boucles for
Motivation¶
Revenons sur notre programme pour compter de 1 à 5 :
n = 1
while n <= 5:
print(n)
n = n + 11
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
n = 1détermine à partir de quelle valeur on compte;L’incrémentation
n = n + 1détermine par pas de combien on compte;La condition
n <= 5dé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()¶
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
La boucle for de Python est plus générale; elle permet de parcourir tous les éléments
d’une liste, d’un conteneur, d’un itérable. Nous y reviendrons plus tard dans le cours.
Exercice : comptons!¶
Copiez l’instruction
forci-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 SOLUTION0
2
4
6
8
10
12
14
16
18
20
Écrivez des boucles
forqui 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 SOLUTION0
3
6
9
12
20, 21, 22, 23, 24, 25 :
### BEGIN SOLUTION
for i in range(20, 26):
print(i)
### END SOLUTION20
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 SOLUTION10
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")### 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 SOLUTIONdebut()
### 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 SOLUTIONassert 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 SOLUTIONdebut()
carre(0) # La fourmi ne fait riendebut()
carre(1) # La fourmi doit faire un tour sur elle-mêmedebut()
carre(5) # la fourmi doit parcourir un carré de longueur 5 casesExercices supplémentaires¶
import glob, os
from jupylates import Exerciser
os.chdir("../exercices")
Exerciser(glob.glob("boucles-for/*"), mode="train")Bilan¶
Lorsque la boucle fait intervenir un compteur, on utilise généralement une boucle for et sinon une boucle while.