UKOnline

Itérateur

Terminons ce chapitre avec le concept d'itérateur, mécanisme permettant de parcourir les éléments de n'importe quelle collection d'éléments. Le parcours se fait de manière transparente, sans que l'on doive se soucier de la manière avec laquelle les éléments de la collection sont organisés.

Dans le cas des séquences, étant donné que leurs éléments sont ordonnés, leurs parcours suivra toujours cet ordre. Mais comme on le verra dans la seconde partie du livre, ce n'est pas le cas pour toutes les collections. L'itérateur n'est pas nécessaire, on peut toujours utiliser une boucle while classique. Il rend néanmoins parfois le code bien plus lisible et il est également parfois la seule solution utilisable, lorsqu'il n'est, par exemple, pas possible d'accéder directement aux éléments d'une collection.

Instruction for

Pour parcourir une collection d'éléments, on peut utiliser l'instruction for. Voyons tout de suite un premier exemple :

Lors de l'exécution de ces instructions, la variable n prend successivement comme valeur celle des éléments de la liste numbers. Étant donné que c'est une liste, et donc une séquence ordonnée, ses éléments sont parcourus dans l'ordre défini par la liste.

Avec cette méthode de parcours, on ne doit plus utiliser d'indice pour accéder aux éléments de la liste. Si on désire quand même utiliser les indices, il suffit de créer une séquence avec ces derniers, un intervalle par exemple, et de la parcourir avec l'itérateur :

On remarque qu'on n'a spécifié qu'un seul paramètre à la fonction range et dans ce cas, la borne inférieure vaut par défaut $0$, ce qui correspond bien au premier indice d'une liste.

Définition de séquence par compréhension

L'instruction for peut également être utilisée dans un autre contexte. Jusqu'à présent, pour créer une nouvelle séquence, soit on en spécifiait tous les éléments lors de son initialisation, soit on la construisait en faisant du slicing, de la concaténation ou une répétition.

Grâce à l'instruction for, on va pouvoir créer une nouvelle séquence par compréhension, c'est-à-dire en sélectionnant un sous-ensemble d'une séquence dont les éléments satisfont une propriété.

Prenons un exemple pour comprendre ce concept. Si on veut construire une séquence qui contient les carrés des nombres entiers compris entre $0$ et $100$ (inclus), on ne peut pas le faire en listant toutes les valeurs. Une première solution consiste à utiliser une boucle et la fonction append qui permet d'ajouter un élément à une liste. La boucle suivante parcourt les entiers de $0$ à $100$ et ajoute à la liste squares les carrés de ces entiers :

Cette boucle peut évidemment se réécrire avec l'instruction for et à l'aide de la fonction range à qui on donne $101$ en paramètre, ce dernier représentant la borne supérieure de l'intervalle, non incluse :

Lorsqu'on a cette structure particulière de boucle, dont le but est d'initialiser une liste, on peut l'écrire de manière plus compacte pour directement définir les éléments de la liste lors de son initialisation :

Cette notation, plus intuitive, se lit comme : « la liste est composée d'éléments de la forme $i^2$ pour tout $i$ compris entre $0$ et $101$ (exclu) ». C'est ce qu'on appelle une définition de liste par compréhension.

De plus, il est possible d'ajouter une condition que doivent satisfaire les éléments générés, à l'aide d'une instruction if. Supposons, par exemple, qu'on ne veuille que les carrés des entiers qui sont divisibles par $3$. Pour cela, on écrira simplement :

Cela revient en fait à écrire le code suivant :