Les boucles

Une boucle est une instruction qui permet de répéter plusieurs fois de suite une autre instruction ou tout un bloc d'instructions. Dans la suite, on distinguera deux types de boucles: l'instruction for et l'instruction while

1. L ' instruction " for "

Voici un petit script très simple qui illustre le fonctionnement de l'instruction "for "

Comme vous pouvez le voir ci-dessous, l'instruction print qui affiche la chaine de caractères 'bonjour' a simplement été exécutée 4 fois de suite


le script

l'affichage

Du point de vue de la syntaxe, il est important de retenir deux choses:

  • l'instruction for se termine par deux points " : "

  • l'instruction ou le bloc d'instructions qui doivent être répétés doivent se situer avec un décalage vers la droite par rapport au niveau de l'instruction for. On parle d'indentation

Observez les deux scripts suivants: dans le premier cas l'indentation de la ligne 3 permet à l'interpréteur python de comprendre que cette instruction fait partie du bloc qu'il faut répéter. Dans le second cas, puisqu'il n'y a pas d'indentation, l'instruction située à la ligne 3 ne s'exécutera qu'une fois la boucle terminée

exemple 1

exemple 2

Lorsqu'on utilise une instruction for, on doit définir une variable qui jouera le rôle du compteur: c'est la variable appelée i dans les exemples précédents (i pour indice, mais son nom est la prérogative du programmeur qui peut l'appeler comme bon lui semble). Dans les exemples suivants, i est donc un compteur qui prendra 4 valeurs entières successives: de 0 à 3 (et non pas de 1 à 4, ATTENTION !)

exemple 3

exemple 4

EXERCICES

Exercice 1: A l'aide d'une boucle for, afficher: 0 10 20 30 40 50 60 70 80

Exercice 2: A l'aide d'une boucle for, afficher: 2 3 4 5 6 7 8 9 10

Exercice 3: A l'aide d'une boucle for, afficher 1 4 7 10 13 16 19 22 25

Exercice 4: A l'aide d'une boucle for, afficher 1 2 5 10 17 26 37 50

Exercice 5: A l'aide d'une boucle for, à l'aide de la table ASCII, afficher: e f g h i j k l m n

Correction exercice 1

# un premier script possible

for i in range (9):

print (i*10)


# un deuxième script possible. Ici l'instruction range (début, fin, pas) impose au compteur de parcourir toutes les valeurs entières de début à fin-1 en faisant de sauts égaux à la valeur du pas

for i in range (0,81,10):

print (i)


Correction exercice 2

# un premier script possible

for i in range (9):

print (i+2)


# un deuxième script possible. Ici l'instruction range (début, fin) impose au compteur de parcourir toutes les valeurs entières de début à fin-1

for i in range (2,11):

print (i)


Correction exercice 3

# un premier script possible

for i in range (9):

print (3*i+1)


# un deuxième script possible. Ici l'instruction range (début, fin, pas) impose au compteur de parcourir toutes les valeurs entières de début à fin-1 en faisant de sauts égaux à la valeur du pas

for i in range (1,23,3):

print (i)


Correction exercice 4

# un script possible

for i in range (8):

print (i*i+1)

Correction exercice 5

# un script possible

for i in range(10):

print(chr(i+101), end=' ')


# un autre script possible

for i in range(101,111):

print(chr(i), end=' ')


Une des applications courantes d'une boucle est qu'elle permet de calculer aisément certaines sommes. Dans l'exemple 5 (ci-dessous), on calcule la somme suivante S = 1 + 2 + 3 + ... + 20. Notez qu'il faut définir deux variables: le compteur n et la valeur des sommes intermédiaires S

exemple 5

EXERCICES

Exercice 6: A l'aide d'une boucle for, calculer: 1 + 2 + 4 + 8 +16 + ... + 512 (la somme des 10 premières puissances de 2 donne 1023)

Exercice 7: A l'aide d'une boucle for, en utilisant la table ASCII, afficher la chaine de caractères: abcdefghijklmnopqrstuvwwxyz


Correction exercice 6

# un script possible

S = 0

for i in range(10):

S = S+2**i

print(S)


# un autre script possible. Ce deuxième script semble à priori moins bon que le premier car il utilise une variable (terme) en plus. En effet, le script calcule la valeur du terme suivant en multipliant le précédent par 2. Puis il l'ajoute à la somme S. En réalité, ce script à l'avantage de ne pas recalculer les puissances de 2 à chaque étape et de se contenter d'une simple multiplication par 2. Ce script est donc moins gourmand en calcul que le précédent. A notre niveau, cela n'a aucune importance mais lorsqu'on travaille avec des très grands nombres et de très longues boucles il est nécessaire de se poser la question.

# Dernière remarque: si on inverse l'ordre ses instructions S = S + terme et terme = terme*2, le script ne fonctionne pas. Vous pouvez le tester. Il est important de comprendre pourquoi.

S,terme = 0,1

for i in range(10):

S = S+terme

terme = terme*2

print(S)


Correction exercice 7

# un script possible

alphabet=''

for i in range (26):

alphabet = alphabet + chr(i+97)

print (alphabet)


On peut également imbriquer deux boucles (ou davantage) l'une dans l'autre. Pour cela, on a besoin d'un compteur différent pour chacune des boucles.

Dans l'exemple 6 ci-dessous, i prend les valeurs 0, 1 et 2 tandis que j prend les valeurs 0 et 1.

Dans l'exemple 7 ci-dessous, i prend les valeurs 0, 1, 2 et 3 tandis que j prend les valeurs entières de 0 à i

exemple 6

exemple 7

exemple 8

Si on regarde attentivement le fonctionnement de ces deux boucles imbriquées (exemple 8), on constate que i prend successivement 3 valeurs (1, 2 et 3). Pour chaque valeur de i, le script effectue une boucle complète correspondant au compteur j (de 1 à 4) puis va à la ligne (affichage vide). Au niveau de l'affichage, chaque passage dans la première boucle correspond à une ligne. L'instruction print(i,j) s'exécute 3*4 = 12 fois et l'instruction print() s'exécute 3 fois.

exemple 9

Dans l'exemple 9 ci-dessus, on a affiché toutes les paires possibles composées de 2 lettres distinctes du mot LIVRE

EXERCICES

Exercice 8: A l'aide de deux boucles imbriquées, afficher: 01234 / 12345 / 23456 /

Exercice 9: A l'aide de deux boucles imbriquées, afficher: 0123 / 2345 / 4567 / 6789 /

Exercice 10: A l'aide de deux boucles imbriquées, afficher: 1 / 11 / 111 / 1111 / 11111 /

Exercice 11: A l'aide de deux boucles imbriquées, afficher: b ; bo ; bou ; bouc ; boucl ; boucle ;

Correction exercice 8

# un script possible

for i in range (3):

for j in range (5):

print(i+j, end='')

print(' / ', end='')


# un autre script possible

for i in range (3):

for j in range(i,i+5):

print (j, end='')

print(' / ', end='')


Correction exercice 9

# un script possible

for i in range (4):

for j in range (4):

print(2*i+j, end='')

print(' / ', end='')


# un autre script possible, en imposant un pas égal à 2 au compteur i

for i in range (0,7,2):

for j in range(i,i+4):

print (j, end='')

print(' / ', end='')


Correction exercice 10

# un script possible

for i in range (5):

for j in range (i+1):

print('1', end='')

print(' / ', end='')


# un autre script possible. On peut effet remarquer que les entiers affichés sont de la forme 10**0 + 10**1 + 10**2+ ...

for i in range (5):

n = 0

for j in range (i+1):

n = n + 10**j

print (n, end=' ; ')


Correction exercice 11

# un script possible

mot = 'boucle'

for i in range(6):

for j in range (i+1):

print(mot[j], end='')

print(' ; ', end='')


# un script possible avec une seule boucle. En effet, l'instruction mot[:indice] renvoie la chaine de caractères composée de toutes les lettres de la variable mot jusqu'à l'indice de valeur indice-1 inclus.

mot = 'boucle'

for i in range (len(mot)):

print(mot[:i+1], end=' ; ')