1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
def drange(start, stop=None, step=1.0):
"""
Version de xrange pour les nombres flottants.
Admet les mêmes arguments que xrange.
Admet aussi les nombres négatifs.
>>> list(drange(3))
[0.0, 1.0, 2.0]
>>> list(drange(2, 6, 1.5))
[2.0, 3.5, 5.0]
>>> list(drange(1, -6, -1))
[1.0, 0.0, -1.0, -2.0, -3.0, -4.0, -5.0]
"""
# On s'assure de ne pas tomber dans une boucle infinie en vérifiant que step
# ne vaut pas 0.
assert step
# Si 1 seul argument est entré, il s'agit alors de stop. start vaut dont 0
# et step vaut 1.
if stop is None:
stop = start
start = 0.0
# On s'assure de ne travailler que sur des flottants. Cela n'a d'impact que
# sur l'affichage.
start, stop, step = (float(x) for x in (start, stop, step))
# itertools est notre ami !
for i in itertools.count():
# On évite d'accumuler les erreurs d'arrondi.
nbr = start + i * step
# Condition de fin de boucle (pour les incréments positifs ET négatifs).
if (step > 0 and nbr >= stop) or (step < 0 and nbr <= stop):
return
yield nbr |
Partager