Ceci est une ancienne révision du document !
L'itérateur xrange() est très rapide, mais il a un défaut: il ne supporte pas les entiers longs parce qu'il utilise les types de données du C.
Voilà un itérateur qui fait la même chose que xrange, mais qui n'a pas le même défaut. En contrepartie, il est un peu moins rapide.
Un avantage, c'est qu'il permet de conserver les boucles for au lieu de while avec les entiers longs, ce qui rend le code plus clair.
Voilà le code proposé:
def xplage(*arg): la = len(arg) if la == 1: xmin, xmax, xpas = 0, arg[0], 1 elif la == 2: xmin, xmax, xpas = arg[0], arg[1], 1 elif la == 3: xmin, xmax, xpas = arg[0], arg[1], arg[2] else: raise ValueError ("Erreur xplage: nombre d'arguments doit être 1,2,ou 3") if xpas == 0: raise ValueError ("Erreur xplage: le pas ne peut être nul") x = xmin if xpas>0: if xmax<xmin: raise ValueError ("Erreur xplage: bouclage infini") while x<xmax: yield x x += xpas else: if xmax>xmin: raise ValueError ("Erreur xplage: bouclage infini") while x>xmax: yield x x += xpas
En entrée, on l'utilise de la même façon qu'xrange():
Cela marche avec xmax<xmin à condition, bien sûr, que xpas<0 (sinon, erreur)
Avec xmax>xmin, il faut xpas>0 (sinon, erreur)
Il faut aussi xpas!=0 (sinon, erreur: une boucle avec un pas nul n'a guère de sens…)
Exemples d'utilisation:
for x in xplage(7): print x 0 1 2 3 4 5 6
for x in xplage(5,10): print x 5 6 7 8 9
for x in xplage(5,10,2): print x 5 7 9
for x in xplage(5,-5,-2): print x 5 3 1 -1 -3
Amusez-vous bien!