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.
Exemple
#lessons = ["Variables", "Boucles", "Fonctions"]
it = iter(lessons)
print(next(it))
print(next(it))
print(list(it))
print(list(it))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
#iter(iterable)
iter(callable, sentinel)Paramètres
#iterable
objet itérable
Une collection, ou un autre objet que l’on peut parcourir avec une bouclefor.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. Quandcallablela renvoie, l’itérateur se termine, et la sentinelle elle-même n’est pas renvoyée.
Plus d’exemples
#scores = [72, 95, 64]
it = iter(scores)
while True:
try:
score = next(it)
except StopIteration:
break
print(score)
print(iter(it) is it)La boucle while fait pas à pas exactement ce que fait l’écriture courte for score in scores:.
import io
stream = io.StringIO("1_1;1_2;1_3;1_4")
for chunk in iter(lambda: stream.read(4), ""):
print(chunk)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.
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))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’appeleriter(). Cela devient utile seulement quand vous voulez récupérer les éléments à la main avecnext(), 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.