Magazine Internet

Python et les itérateurs

Publié le 20 août 2008 par Mikebrant

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é.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Mikebrant 9 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte