4.2. Boucles

Comme dans beau de langages de programmation, il existe deux types de boucles en Python :

  • les boucles inconditionnelles qui permettent d’exécuter un bloc d’instructions un nombre de fois fixé à l’avance ;
  • les boucles conditionnelles qui permettent l’exécution d’un code tant qu’une condition est remplie.

4.2.1. Boucles inconditionnelles

Les boucles inconditionnelles en Python permettent de parcourir un objet de type itérable (comme une liste, un tuple ou une chaîne de caractères) élément par élément.

De manière générale, on utilise les mots-clés for et in.

for <element> in <iterable>:
    <instruction1>
    <instruction2>
    ...

On peut itérer aussi bien sur des listes

In [1]: for elt in [1, 'toto', 2.34]:
   ...:     print(elt)
   ...: 
1
toto
2.34

que sur des tuples

In [2]: for elt in 5, 6, 'tata':    # pas besoin de parenthèses pour le tuple dans ce cas
   ...:     print(elt)
   ...: 
5
6
tata

et même sur des chaînes de caractère.

In [3]: for elt in 'blabla':
   ...:     print(elt)
   ...: 
b
l
a
b
l
a

La fonction range

La fonction range renvoie un itérable contenant des entiers. Plus précisément, lorsque a, b, c sont des entiers (c!=0),

  • range(a) contient les entiers 0, 1, 2, ..., a-2, a-1 (aucun si a <= 0) ;
In [4]: for i in range(5):
   ...:     print(i)
   ...: 
0
1
2
3
4
In [5]: for i in range(-5):
   ...:     print(i)
   ...: 
  • range(a, b) contient les entiers a, a+1, a+2, ..., b-2, b-1 (aucun si b <= a) ;
In [6]: for i in range(3, 8):
   ...:     print(i)
   ...: 
3
4
5
6
7
In [7]: for i in range(8, 3):
   ...:     print(i)
   ...: 
  • range(a, b, c) contient les entiers a, a+c, a+2c, ... jusqu’à atteindre b exclu (aucun si c*(b-a)<=0).
In [8]: for i in range(4, 9, 2):
   ...:     print(i)
   ...: 
4
6
8
In [9]: for i in range(9, 4, 2):
   ...:     print(i)
   ...: 
In [10]: for i in range(9, 4, -2):
   ....:     print(i)
   ....: 
9
7
5
In [11]: for i in range(4, 9, -2):
   ....:     print(i)
   ....: 

4.2.2. Listes en compréhension

En mathématiques, il existe plusieurs manières de décrire un même ensemble. L’ensemble \(\mathcal{A}\) des entiers pairs compris entre 0 et 19 peut être défini en extension :

\[\mathcal{A}=\{0,2,4,6,8,10,12,14,16,18\}\]

Il peut également être décrit en compréhension :

\[\mathcal{A}=\{2n,\;n\in[\![0,9]\!]\}\]

De la même manière, la liste de ces entiers peut être défini en Python en extension :

In [12]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Out[12]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

et en compréhension :

In [13]: [2*n for n in range(10)]
Out[13]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

On parle alors de liste en compréhension.

Une autre manière de définir \(\mathcal{A}\) en compréhension est la suivante :

\[\mathcal{A} = \{x\in[\![0,19]\!],\;x\equiv0[2]\}\]

La version correspondante en Python est :

In [14]: [n for n in range(20) if n%2==0]
Out[14]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Bien entendu, on peut utiliser ce type de liste pour d’autres objets que des entiers [1].

In [15]: [s.upper() for s in ('toto', 'tata', 'titi', 'zozo', 'zaza', 'zizi') if s[0]=='t']
Out[15]: ['TOTO', 'TATA', 'TITI']

4.2.3. Boucles conditionnelles

Une boucle conditionnelle consiste à répéter un bloc d’instructions tant qu’une condition est vraie.

Notes

[1]

Les listes en compréhension peuvent être utilisées pour effectuer des actions plutôt que de calculer des valeurs.

In [16]: s = ([], [1, 2], ['titi', 'tata'])

In [17]: [li.append('toto') for li in s]
Out[17]: [None, None, None]

In [18]: s
Out[18]: (['toto'], [1, 2, 'toto'], ['titi', 'tata', 'toto'])