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”.
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):
La fonctionnalité “itérateur” est obtenue par:
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.
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!