Outils pour utilisateurs

Outils du site


classe_iterable

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

Exemple de codage: simuler la fonction xrange()

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.

Exemple de codage: n'afficher que les lignes non-vides d'une fichier texte

Même principe, voici le codage de la classe itérable:

class fichier(object):
 
    def __init__(self, nf):
        self.f = open(nf, 'r')
 
    def __iter__(self):
        return self
 
    def next(self):
        while True:
            ligne = self.f.readline()
            if len(ligne)==0:
                self.f.close()
                raise StopIteration
            ligne = ligne.rstrip('\r\n')
            if ligne.strip()!="":
                break
        return ligne

Et voilà comment on s'en sert:

nf = r"C:\Chemin\test.txt"
 
for ligne in fichier(nf):
    print ligne


Amusez-vous bien!

classe_iterable.txt · Dernière modification: 2009/10/19 18:51 par tyrtamos

Outils de la page