Compréhension des Itérateurs en Python
Que sont les itérateurs ?
Techniquement, en Python, un itérateur est un objet qui implémente le protocole d'itérateur, lequel 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, une exceptionStopIterationest levée 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 de caractères) un à un tout en gardant la trace de sa position.
iterator = iter(iterable)
Remarque
Un itérateur est également un itérable car 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 n'est pas un itérateur. Lorsque vous la transmettez à la fonction
iter(), vous obtenez un itérateur qui permet un parcours élément par élément.
Créer un itérateur personnalisé
Cet itérateur génère un nombre fixe de lancers de dé aléatoires et s'arrête une fois tous les lancers effectués.
123456789101112131415161718192021222324252627import 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 d'un itérateur
Une fois qu'un itérateur est épuisé, il ne peut pas être réutilisé sans être recréé. Par exemple :
12345678910numbers = [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, il est nécessaire de créer un nouvel itérateur.
Swipe to start coding
Complétez les parties manquantes du code pour implémenter une classe d'itérateur personnalisée simulant 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 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é de manière paresseuse. Arrêtez-vous après 10 lancers à l'aide d'une condition if et de l'instruction break.
Solution
Merci pour vos commentaires !
single
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Can you explain the difference between an iterator and an iterable in more detail?
How can I create my own custom iterator for a different use case?
What happens if I try to use an exhausted iterator again?
Awesome!
Completion rate improved to 3.13
Compréhension des Itérateurs en Python
Glissez pour afficher le menu
Que sont les itérateurs ?
Techniquement, en Python, un itérateur est un objet qui implémente le protocole d'itérateur, lequel 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, une exceptionStopIterationest levée 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 de caractères) un à un tout en gardant la trace de sa position.
iterator = iter(iterable)
Remarque
Un itérateur est également un itérable car 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 n'est pas un itérateur. Lorsque vous la transmettez à la fonction
iter(), vous obtenez un itérateur qui permet un parcours élément par élément.
Créer un itérateur personnalisé
Cet itérateur génère un nombre fixe de lancers de dé aléatoires et s'arrête une fois tous les lancers effectués.
123456789101112131415161718192021222324252627import 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 d'un itérateur
Une fois qu'un itérateur est épuisé, il ne peut pas être réutilisé sans être recréé. Par exemple :
12345678910numbers = [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, il est nécessaire de créer un nouvel itérateur.
Swipe to start coding
Complétez les parties manquantes du code pour implémenter une classe d'itérateur personnalisée simulant 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 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é de manière paresseuse. Arrêtez-vous après 10 lancers à l'aide d'une condition if et de l'instruction break.
Solution
Merci pour vos commentaires !
single