Outils pour utilisateurs

Outils du site


classe_iterable

Ceci est une ancienne révision du document !


Rendre une classe itérable

Objectif

Dans certains cas, il est intéressant de pouvoir construire un itérateur, c'est à dire une fonction qu'on peut utiliser, par exemple dans une boucle for comme suit, et qui renvoie une nouvelle valeur à chaque fois:

for x in iterateur():
    ...

Le code qui suit consiste à créer une classe qui possède la fonction “itérateur”.

Codage

A titre d'exemple, on va créer une classe qui simule la fonction “xrange()”, et on va l'appeler “xplage()”.

Comme pour xrange, on va faire en sorte que pour xplage(x, y, z):

  • avec un seul paramètre (x): deb=0, fin=x, pas=1
  • avec 2 paramètres (x, y): deb=x, fin=y, pas=1
  • avec 3 paramètres (x, y, z): deb=x, fin=y, pas=z

La fonctionnalité “itérateur” est obtenue par:

  • la méthode __iter__() dont le contenu est défini
  • la méthode next() qui teste la condition d'arrêt, incrémente le compteur et renvoie la valeur attendue
  • la condition d'arrêt qui déclenche une exception StopIteration
  • la valeur retournée à chaque itération par le “return” de la méthode next()
class xplage(object):
 
    def __init__(self, deb, fin=None, pas=None):
        if pas==None:
            if fin==None:
                # 1 seul paramètre
                self.deb = 0
                self.fin = deb
                self.pas = 1
            else:
                # 2 paramètres
                self.deb = deb
                self.fin = fin
                self.pas = 1
        else:
            # 3 paramètres
            self.deb = deb
            self.fin = fin
            self.pas = pas
        self.cpt = self.deb  # initialisation du compteur
 
    def __iter__(self):
        return self
 
    def next(self):
        if self.cpt >= self.fin:
            raise StopIteration
        k = self.cpt
        self.cpt += self.pas  # incrementation du compteur pour le prochain appel
        return k 

Voici des exemples d'utilisation:

for i in xplage(10):
    print i
0
1
2
3
4
5
6
7
8
9
for i in xplage(5, 10):
    print i
5
6
7
8
9
for i in xplage(5, 10, 3):
    print i
5
8

En partant de ce principe, il est assez facile d'ajouter de telle fonctions d'itération à n'importe quelle classe.

Amusez-vous bien!

classe_iterable.1251750601.txt.gz · Dernière modification: 2009/08/31 22:30 de tyrtamos

Outils de la page