Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente | Dernière révision Les deux révisions suivantes | ||
xplage [2010/01/12 19:02] tyrtamos |
xplage [2011/03/13 07:30] 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' | + | L' |
- | Voilà un itérateur qui fait la même chose que xrange, mais qui n'a pas le même défaut. En contrepartie, | + | 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): | ||
- | | + | |
- | 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 (" | raise ValueError (" | ||
x = xmin | x = xmin | ||
+ | if isinstance(xpas, | ||
+ | eps = xpas/10.0 | ||
+ | else: | ||
+ | eps = 0 | ||
if xpas>0: | if xpas>0: | ||
if xmax< | if xmax< | ||
raise ValueError (" | raise ValueError (" | ||
- | while x<xmax: | + | while x+eps<xmax: |
yield x | yield x | ||
x += xpas | x += xpas | ||
Ligne 36: | Ligne 40: | ||
if xmax> | if xmax> | ||
raise ValueError (" | raise ValueError (" | ||
- | while x>xmax: | + | while x+eps>xmax: |
yield x | yield x | ||
x += xpas | x += xpas | ||
Ligne 43: | Ligne 47: | ||
En entrée, on l' | En entrée, on l' | ||
- | * 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< | + | Il faut, bien sûr, que le signe de xpas et celui de xmax-xmin soient les mêmes |
- | + | ||
- | Avec xmax>xmin, il faut xpas> | + | |
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 | ||
</ | </ | ||
+ | |||
+ | Si le pas est un flottant, il faut se prémunir contre des erreurs de comparaison (comme 19.999999999999995< | ||
+ | |||
+ | 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 | ||
+ | </ | ||
+ | |||
+ | 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 | ||
+ | </ | ||
+ | |||
\\ | \\ |