Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
xplage [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


xplage

Warning: Undefined array key -1 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1458

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
xplage [2010/01/12 19:02]
tyrtamos
xplage [2011/03/13 07:38]
tyrtamos
Ligne 1: Ligne 1:
-====== Un xrange qui accepte les entiers longs ======+====== Un xrange qui accepte les entiers longs et les flottants ======
  
 ===== Objectif ===== ===== Objectif =====
  
-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.+L'itérateur xrange() est très rapide, mais il a un défaut: il ne supporte que les entiers 'int', (et donc ni les 'long' ni les 'float'parce qu'il utilise les types de données du C. En contrepartie, la boucle est très rapide.
  
-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.+Voilà un itérateur qui fait la même chose que xrange, mais qui n'a pas le même défaut.
  
-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.+Un avantage, c'est qu'il permet de conserver les boucles for au lieu de while avec les entiers longs et les flottants, ce qui rend le code plus clair.
  
 ===== Code ===== ===== Code =====
Ligne 15: Ligne 15:
 <code python> <code python>
 def xplage(*arg): def xplage(*arg):
-    la = len(arg) +    lga = len(arg) 
-    if la == 1:+    if lga == 1:
         xmin, xmax, xpas = 0, arg[0], 1         xmin, xmax, xpas = 0, arg[0], 1
-    elif la == 2:+    elif lga == 2:
         xmin, xmax, xpas = arg[0], arg[1], 1         xmin, xmax, xpas = arg[0], arg[1], 1
-    elif la == 3:+    elif lga == 3:
         xmin, xmax, xpas = arg[0], arg[1], arg[2]         xmin, xmax, xpas = arg[0], arg[1], arg[2]
     else:     else:
Ligne 27: Ligne 27:
         raise ValueError ("Erreur xplage: le pas ne peut être nul")         raise ValueError ("Erreur xplage: le pas ne peut être nul")
     x = xmin     x = xmin
 +    if isinstance(xpas, float):
 +        eps = xpas/10.0
 +    else:
 +        eps = 0
     if xpas>0:     if xpas>0:
         if xmax<xmin:         if xmax<xmin:
             raise ValueError ("Erreur xplage: bouclage infini")             raise ValueError ("Erreur xplage: bouclage infini")
-        while x<xmax:+        while x+eps<xmax:
             yield x             yield x
             x += xpas             x += xpas
Ligne 36: Ligne 40:
         if xmax>xmin:         if xmax>xmin:
             raise ValueError ("Erreur xplage: bouclage infini")             raise ValueError ("Erreur xplage: bouclage infini")
-        while x>xmax:+        while x+eps>xmax:
             yield x             yield x
             x += xpas             x += xpas
Ligne 43: Ligne 47:
 En entrée, on l'utilise de la même façon qu'xrange(): En entrée, on l'utilise de la même façon qu'xrange():
  
-  * avec un argument: c'est xmax (xmin=0, xpas=1)+  * avec un seul argument: c'est xmax (xmin=0, xpas=1)
  
   * avec 2 arguments: ce sont xmin  et xmax (xpas=1)   * avec 2 arguments: ce sont xmin  et xmax (xpas=1)
Ligne 49: Ligne 53:
   * avec 3 arguments: ce sont xmin, xmax et xpas   * avec 3 arguments: ce sont xmin, xmax et xpas
  
-Cela marche avec xmax<xmin à condition, bien sûr, que xpas<0 (sinon, erreur) +Il faut, bien sûr, que le signe de xpas et celui de xmax-xmin soient les mêmes (sinon, erreur pour bouclage infini)
- +
-Avec xmax>xmin, il faut xpas>(sinon, erreur)+
  
 Il faut aussi xpas!=0 (sinon, erreur: une boucle avec un pas nul n'a guère de sens...) Il faut aussi xpas!=0 (sinon, erreur: une boucle avec un pas nul n'a guère de sens...)
Ligne 96: Ligne 98:
 -3 -3
 </code> </code>
 +
 +<code python>
 +for x in xplage(9999999999999999999999999999999999999999L, 9999999999999999999999999999999999999999L+10L):
 +    print x
 +9999999999999999999999999999999999999999
 +10000000000000000000000000000000000000000
 +10000000000000000000000000000000000000001
 +10000000000000000000000000000000000000002
 +10000000000000000000000000000000000000003
 +10000000000000000000000000000000000000004
 +10000000000000000000000000000000000000005
 +10000000000000000000000000000000000000006
 +10000000000000000000000000000000000000007
 +10000000000000000000000000000000000000008
 +</code>
 +
 +Si le pas est un flottant, il faut se prémunir contre des erreurs de comparaison (comme 19.999999999999995<20) avec l'ajout de la variable eps=xpas/10.0.
 +
 +Par exemple:
 +
 +<code python>
 +for i in xplage(2, 16, 0.01):
 +    print i
 +2
 +2.01
 +2.02
 +2.03
 +...
 +15.97
 +15.98
 +15.99
 +</code>
 +
 +Et ça marche aussi avec les pas négatifs:
 +
 +<code python>
 +for i in xplage(2, -16, -0.01):
 +    print i
 +2
 +1.99
 +1.98
 +1.97
 +...
 +-15.97
 +-15.98
 +-15.99
 +</code>
 +
  
 \\ \\
xplage.txt · Dernière modification: 2011/03/13 07:38 de tyrtamos