Dis papa, dis papa, dis-moi, dis-moi. Comment c’est fait dans une boucle for ?
lundi 31 décembre 2012 à 17:10Dis papa, dis papa, dis-moi, dis-moi. Comment c’est fait dans une boucle for
?
C’est pas compliquéééééééééééé, j’vais tout t’expliquuuuuerrrrrrrrrr.
C´est le p´tit zinzin qui passe par ici:
>>> class MonIterable(object): # faisons notre propre itérable ... ... def __init__(self): ... self.values = [1, 2] ... ... def __iter__(self): # ('for' appelle __iter__ automatiquement) ... return self # __iter__ doit renvoyer un iterateur, ici nous-même ... ... def next(self): # chaque tour de boucle, for appelle next() ... if self.values: # qui retourne une des valeus de self.values ... return self.values.pop() # en l'enlevant de la liste initiale ... raise StopIteration() # si il y en a plus, il dit stop ! ...
Et qui va toucher le p´tit machinnnnnnnnnnnnnnnnnnnnnnnnn !
>>> for x in MonIterable(): # ceci appelle next() jusqu'à StopIteration ... print x 2 1
Et le p´tit machin qui repasse par là:
>>> iterateur = iter(MonIterable()) # Voilà ce que ça donne à la main >>> iterateur.next() 2 >>> iterateur.next() 1 >>> iterateur.next() # l'exception: mécanisme naturel de Python pour stopper une boucle ! Traceback (most recent call last): File "<pyshell#9>", line 19, in <module> iterateur.next() File "<pyshell#9>", line 14, in next raise StopIteration() StopIteration
Et qui fait marcher ce p´tit zinzinnnnnnnnnnnnn !
>>> iterateur = iter(range(3)) # c'est pareil pour tous les iterables >>> iterateur.next() # un iterateur est juste un truc avec une méthode next() 0 >>> iterateur.next() # next() doit retourner la prochain valeur de l'iterable 1 >>> iterateur.next() # un itérateur itère donc sur un iterable 2 >>> iterateur.next() # jusqu'à la fin, où il lève StopIteratino Traceback (most recent call last): File "<ipython-input-19-6c9f9efdd35c>", line 1, in <module> iterateur.next() StopIteration
Ah bon ?