Contenu du cours
Concepts Avancés de Python
Concepts Avancés de Python
Comprendre les Itérateurs
Qu'est-ce qu'un itérateur ?
Techniquement, en Python, un itérateur est un objet qui implémente le protocole d'itération, qui se compose des méthodes suivantes :
__iter__()
: retourne l'objet itérateur lui-même, le rendant compatible avec les boucles commefor
;__next__()
: retourne l'élément suivant de la séquence. Lorsqu'il n'y a plus d'éléments, il lève une exceptionStopIteration
pour signaler la fin du parcours.
Un itérateur permet de parcourir les éléments d'un itérable (par exemple, une liste ou une chaîne) un à la fois tout en gardant une trace de sa position.
Remarque
Un itérateur est aussi un itérable parce qu'il implémente la méthode
__iter__()
.Tous les itérables ne sont pas des itérateurs. Par exemple, une liste est itérable mais pas un itérateur. Lorsque vous la passez à la fonction
iter()
, vous obtenez un itérateur qui permet un parcours élément par élément.
Construire un itérateur personnalisé
Cet itérateur génère un nombre fixe de lancers de dés aléatoires et s'arrête une fois que tous les lancers sont terminés.
import random class FiniteDie: def __init__(self, num_rolls): """Initialize the iterator with a fixed number of rolls.""" self.num_rolls = num_rolls self.current_roll = 0 def __iter__(self): """Return the iterator object itself.""" return self def __next__(self): """Generate the next dice roll or stop iteration.""" if self.current_roll < self.num_rolls: self.current_roll += 1 return random.randint(1, 6) raise StopIteration # Using the FiniteDie iterator num_rolls = 5 die_iterator = FiniteDie(num_rolls) print(f"Rolling the die {num_rolls} times:") for roll in die_iterator: print(f"Rolled: {roll}")
Épuisement de l'Itérateur
Une fois qu'un itérateur est épuisé, il ne peut pas être réutilisé sans être recréé. Par exemple :
numbers = [1, 2, 3, 4] iterator = iter(numbers) # First iteration for num in iterator: print(num) # Output: 1, 2, 3, 4 # Second iteration for num in iterator: print(num) # Output: Nothing, the iterator is exhausted.
Les itérateurs ne peuvent être parcourus qu'une seule fois. Pour itérer à nouveau, un nouvel itérateur doit être créé.
Swipe to start coding
Complétez les parties manquantes du code pour implémenter une classe d'itérateur personnalisée pour simuler un lanceur de dé infini. L'itérateur doit générer paresseusement des lancers aléatoires d'un dé à six faces et s'arrêter après 10
lancers.
- La méthode
__iter__()
permet à un objet d'être utilisé comme un itérateur. - La méthode
__next__()
produit le prochain lancer de dé aléatoire (un nombre entre 1 et 6). - Créez une instance de la classe
InfiniteDie
, qui représente le lanceur de dé. - Utilisez une boucle for avec
enumerate()
pour lancer le dé paresseusement. Arrêtez après 10 lancers en utilisant une condition if et l'instruction break.
Solution
Merci pour vos commentaires !
Comprendre les Itérateurs
Qu'est-ce qu'un itérateur ?
Techniquement, en Python, un itérateur est un objet qui implémente le protocole d'itération, qui se compose des méthodes suivantes :
__iter__()
: retourne l'objet itérateur lui-même, le rendant compatible avec les boucles commefor
;__next__()
: retourne l'élément suivant de la séquence. Lorsqu'il n'y a plus d'éléments, il lève une exceptionStopIteration
pour signaler la fin du parcours.
Un itérateur permet de parcourir les éléments d'un itérable (par exemple, une liste ou une chaîne) un à la fois tout en gardant une trace de sa position.
Remarque
Un itérateur est aussi un itérable parce qu'il implémente la méthode
__iter__()
.Tous les itérables ne sont pas des itérateurs. Par exemple, une liste est itérable mais pas un itérateur. Lorsque vous la passez à la fonction
iter()
, vous obtenez un itérateur qui permet un parcours élément par élément.
Construire un itérateur personnalisé
Cet itérateur génère un nombre fixe de lancers de dés aléatoires et s'arrête une fois que tous les lancers sont terminés.
import random class FiniteDie: def __init__(self, num_rolls): """Initialize the iterator with a fixed number of rolls.""" self.num_rolls = num_rolls self.current_roll = 0 def __iter__(self): """Return the iterator object itself.""" return self def __next__(self): """Generate the next dice roll or stop iteration.""" if self.current_roll < self.num_rolls: self.current_roll += 1 return random.randint(1, 6) raise StopIteration # Using the FiniteDie iterator num_rolls = 5 die_iterator = FiniteDie(num_rolls) print(f"Rolling the die {num_rolls} times:") for roll in die_iterator: print(f"Rolled: {roll}")
Épuisement de l'Itérateur
Une fois qu'un itérateur est épuisé, il ne peut pas être réutilisé sans être recréé. Par exemple :
numbers = [1, 2, 3, 4] iterator = iter(numbers) # First iteration for num in iterator: print(num) # Output: 1, 2, 3, 4 # Second iteration for num in iterator: print(num) # Output: Nothing, the iterator is exhausted.
Les itérateurs ne peuvent être parcourus qu'une seule fois. Pour itérer à nouveau, un nouvel itérateur doit être créé.
Swipe to start coding
Complétez les parties manquantes du code pour implémenter une classe d'itérateur personnalisée pour simuler un lanceur de dé infini. L'itérateur doit générer paresseusement des lancers aléatoires d'un dé à six faces et s'arrêter après 10
lancers.
- La méthode
__iter__()
permet à un objet d'être utilisé comme un itérateur. - La méthode
__next__()
produit le prochain lancer de dé aléatoire (un nombre entre 1 et 6). - Créez une instance de la classe
InfiniteDie
, qui représente le lanceur de dé. - Utilisez une boucle for avec
enumerate()
pour lancer le dé paresseusement. Arrêtez après 10 lancers en utilisant une condition if et l'instruction break.
Solution
Merci pour vos commentaires !