iter()

Renvoie un itérateur pour une collection, c’est-à-dire un objet qui fournit ses éléments un par un. C’est le mécanisme sur lequel repose la boucle for.

Renvoie
Un itérateur.
Sur cette page

Exemple

#
Python
lessons = ["Variables", "Boucles", "Fonctions"]
it = iter(lessons)

print(next(it))
print(next(it))
print(list(it))
print(list(it))
Résultatrésultat enregistré, vous pouvez le vérifier
Variables
Boucles
['Fonctions']
[]

Définition et utilisation

#

La fonction iter(collection) renvoie un itérateur : un objet qui se souvient où il en est arrivé et qui fournit l’élément suivant à la demande. Les éléments suivants se récupèrent avec la fonction next(), et quand ils s’épuisent, l’itérateur lève l’exception StopIteration.

La boucle for fait automatiquement la même chose : elle appelle d’abord iter() sur la collection, puis next() jusqu’à StopIteration. Un objet dont on peut obtenir un itérateur (une liste, une chaîne, un dictionnaire, un fichier, un range) s’appelle un objet itérable. L’itérateur lui-même est à usage unique : une fois épuisé, il reste vide, et iter() appelé sur lui renvoie ce même objet.

La seconde forme, iter(callable, sentinel), appelle la fonction sans arguments jusqu’à ce qu’elle renvoie une valeur égale à la sentinelle. C’est utile pour lire des données par morceaux, par exemple depuis un fichier. Votre propre classe devient itérable quand vous lui définissez une méthode __iter__, le plus simplement sous forme de générateur avec yield.

Syntaxe

#
Syntaxe
iter(iterable)
iter(callable, sentinel)

Paramètres

#
  • iterable

    objet itérable

    Une collection, ou un autre objet que l’on peut parcourir avec une boucle for.
  • callable

    fonction sans arguments

    Dans la seconde forme : la fonction appelée à chaque récupération d’élément.
  • sentinel

    n’importe quelle valeur

    La sentinelle. Quand callable la renvoie, l’itérateur se termine, et la sentinelle elle-même n’est pas renvoyée.

Plus d’exemples

#
Voici comment fonctionne la boucle for
Python
scores = [72, 95, 64]
it = iter(scores)

while True:
    try:
        score = next(it)
    except StopIteration:
        break
    print(score)

print(iter(it) is it)
Résultatrésultat enregistré, vous pouvez le vérifier
72
95
64
True

La boucle while fait pas à pas exactement ce que fait l’écriture courte for score in scores:.

Lire par morceaux avec une sentinelle
Python
import io

stream = io.StringIO("1_1;1_2;1_3;1_4")
for chunk in iter(lambda: stream.read(4), ""):
    print(chunk)
Résultatrésultat enregistré, vous pouvez le vérifier
1_1;
1_2;
1_3;
1_4

io.StringIO simule ici un fichier. Avec un fichier ouvert via open(), l’écriture est identique, et une chaîne vide signale la fin des données.

Une classe personnalisée dans une boucle for
Python
class Course:
    def __init__(self, title, lessons):
        self.title = title
        self.lessons = lessons

    def __iter__(self):
        for number, lesson in enumerate(self.lessons, start=1):
            yield f"{number}. {lesson}"

python = Course("Python", ["Variables", "Boucles"])
for line in python:
    print(line)
print(list(python))
Résultatrésultat enregistré, vous pouvez le vérifier
1. Variables
2. Boucles
['1. Variables', '2. Boucles']

Bonnes pratiques

#
  • Un itérateur ne peut être parcouru qu’une seule fois. Si vous avez besoin des données plusieurs fois, stockez-les dans une liste ou créez un nouvel itérateur.
  • Avant une boucle for, vous n’avez pas besoin d’appeler iter(). Cela devient utile seulement quand vous voulez récupérer les éléments à la main avec next(), par exemple pour sauter un en-tête.
  • Une méthode __iter__ écrite comme un générateur renvoie un nouvel itérateur à chaque appel, donc un tel objet peut être parcouru plusieurs fois.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.