Python Language Itérateur vs Iterable vs Générateur


Exemple

Un iterable est un objet qui peut renvoyer un itérateur . Tout objet avec un état possédant une méthode __iter__ et __iter__ un itérateur est une itération. Il peut également s'agir d'un objet sans état qui implémente une méthode __getitem__ . - La méthode peut prendre des indices (à partir de zéro) et élever une IndexError lorsque les indices ne sont plus valides.

La classe str de Python est un exemple d'itérable __getitem__ .

Un itérateur est un objet qui produit la valeur suivante dans une séquence lorsque vous appelez next(*object*) sur un objet. De plus, tout objet avec une méthode __next__ est un itérateur. Un itérateur déclenche StopIteration après avoir épuisé l'itérateur et ne peut pas être réutilisé à ce stade.

Classes itérables:

Les classes itérables définissent une __iter__ et une méthode __next__ . Exemple de classe itérable:

class MyIterable:

    def __iter__(self):

         return self

    def __next__(self):
         #code

#Classic iterable object in older versions of python, __getitem__ is still supported...
class MySequence:

    def __getitem__(self, index):

         if (condition):
             raise IndexError
         return (item)

 #Can produce a plain `iterator` instance by using iter(MySequence())

Essayer d'instancier la classe abstraite du module de collections pour mieux voir cela.

Exemple:

Python 2.x 2.3
import collections
>>> collections.Iterator()
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods next
Python 3.x 3.0
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods __next__

Gérez la compatibilité de Python 3 pour les classes itérables dans Python 2 en procédant comme suit:

Python 2.x 2.3
class MyIterable(object): #or collections.Iterator, which I'd recommend....

     ....

     def __iter__(self): 

          return self

     def next(self): #code

     __next__ = next

Les deux sont maintenant des itérateurs et peuvent être parcourus en boucle:

ex1 = MyIterableClass()
ex2 = MySequence()

for (item) in (ex1): #code
for (item) in (ex2): #code

Les générateurs sont des moyens simples de créer des itérateurs. Un générateur est un itérateur et un itérateur est une itération.