Un court article pour changer.
changer, pour oublier ses peines...
À merde c'est chanter .
Un objet est itérable s'il possède la méthode __iter__().
Les boucle for, while appellent cette méthode .
__iter__() devra renvoyer un objet contenant la méthode next() : l' itérateur.
next() va accéder à chaque élément de l'objet itérable.
Un petit exemple :
#-*- coding:utf-8 -*-
class Liste(list):
def __init__(self, *args):
list.__init__(self, args)
def __iter__(self):
return Iterateur(self) # retourne un objet itérateur
class Iterateur:
def __init__(self,liste):
self.index = 0#notre index
self.liste = liste # l'objet itérable
def next(self):
actuelle = self.index #position actuelle
self.index += 1 #position suivante
if actuelle >= len(self.liste):#si la position actuelle est >= à la taille de la liste alors c'est la fin
print "exception Stopiteration"#une exception StopIteration est levée
exit(0)
return self.liste[actuelle]#on retourne notre caractère de la position actuelle
if __name__ == '__main__' :
liste = Liste(['a','b','c','d','e','f'])
for i in liste :
print i
Alors, nous avons notre classe Liste qui contient donc la méthode __iter__() ( afin d'être itérable) retournant un itérateur : Iterateur() .
Notre autre classe quand à elle implémente logiquement la méthode next() ( afin d'être un itérateur).
next() est assez simple, elle retourne l'objet correspondant à la position de la liste à laquelle on se trouve .
Si l'objet itérable contient aussi next()alors __iter__() peut simplement retourner self : l'objet itérable est alors son propre itérateur .
Voici un exemple un peu plus intéressant :
#-*- coding:Utf-8 -*-
class ListeSuivantPrecedent(list):
def __init__(self, tailleMax):
list.__init__(self)
self.index = 0
self.tailleMax = tailleMax
def ajout(self, sequence):
""" ajoute à la suite de la liste si elle ne fait pas encore tailleMax éléments sinon enlève le 1er élément et rajoute l'autre à la fin"""
if len(self) == self.tailleMax:#si c'est déjà la taille max
del self[0]#on enlève le 1er élément
self.index = self.tailleMax - 1# et on se trouve maintenant à la dernière photo
self.append(sequence)#on ajoute à la suite
def next(self):
""" pour prendre l'image qui suit,et si l'index est max on retourne -1"""
self.index += 1#on incrémente
if self.index == len(self) : #si on arrive à taillemax alors on a dépassé la fin de la liste (vu qu'elle s'arrête à tailleMax-1)
return -1 # et on retourne - 1
return self.index
def previous(self):
""" pour prendre l'image qui précède"""
self.index += -1#on décrémente l'index
if self.index < 0:# si on arrive à -1 : on a dépassé le début
self.index = len(self)-1 if len(self) > 0 else 0#et donc vu qu'on fait une boucle on passe au dernier de la liste
return self.index
def __iter__(self):
return self
Ici notre ListeSuivantPrecedent est itérable et itérateur : __iter__() retourne self et next() est bien présente .
Je n'explique pas le fonctionnement de la classe vu que ce n'est pas le but de l'article, mais on peut se servir d'une telle classe pour, par exemple, implanter un système de mémorisation des x derniers photos vues : je m'en sers pour le widget Pingoo qui devrait bientôt sortir .
Voilà, l'article est terminé.