Recherche…


Itérateur vs Iterable vs Générateur

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.

Qu'est-ce qui peut être itérable

Iterable peut être tout ce dont les éléments sont reçus un par un, en avant uniquement . Les collections Python intégrées sont itérables:

[1, 2, 3]     # list, iterate over items
(1, 2, 3)     # tuple
{1, 2, 3}     # set
{1: 2, 3: 4}  # dict, iterate over keys

Les générateurs retournent les itérables:

def foo():  # foo isn't iterable yet...
    yield 1

res = foo()  # ...but res already is

Itérer sur la totalité des itérables

s = {1, 2, 3}

# get every element in s
for a in s:
    print a  # prints 1, then 2, then 3

# copy into list
l1 = list(s)  # l1 = [1, 2, 3]

# use list comprehension
l2 = [a * 2 for a in s if a > 2]  # l2 = [6]

Vérifier un seul élément dans iterable

Utilisez la décompression pour extraire le premier élément et assurez-vous qu'il est le seul:

a, = iterable

def foo():
    yield 1

a, = foo()  # a = 1

nums = [1, 2, 3]
a, = nums  # ValueError: too many values to unpack

Extraire des valeurs une par une

Commencez avec iter() intégré pour obtenir un itérateur sur iterable et utilisez next() pour obtenir les éléments un par un jusqu'à StopIteration que StopIteration soit StopIteration pour StopIteration la fin:

s = {1, 2}   # or list or generator or even iterator
i = iter(s)  # get iterator
a = next(i)  # a = 1
b = next(i)  # b = 2
c = next(i)  # raises StopIteration

Iterator n'est pas réentrant!

def gen():
    yield 1

iterable = gen()
for a in iterable:
    print a

# What was the first item of iterable? No way to get it now.
# Only to get a new iterator
gen()


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow