From 6092683f0aeb4a3acc74007c97225cdf95a349fe Mon Sep 17 00:00:00 2001 From: Andreas Date: Thu, 29 Apr 2010 21:58:32 +0000 Subject: [PATCH] frange update --HG-- branch : aspn --- src/frange.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/frange.py b/src/frange.py index 797b761..f5f6133 100644 --- a/src/frange.py +++ b/src/frange.py @@ -1,6 +1,65 @@ +# http://code.activestate.com/recipes/577068-floating-point-range/ + +def frange(*args): + """frange([start, ] end [, step [, mode]]) -> generator + + A float range generator. If not specified, the default start is 0.0 + and the default step is 1.0. + + Optional argument mode sets whether frange outputs an open or closed + interval. mode must be an int. Bit zero of mode controls whether start is + included (on) or excluded (off); bit one does the same for end. Hence: + + 0 -> open interval (start and end both excluded) + 1 -> half-open (start included, end excluded) + 2 -> half open (start excluded, end included) + 3 -> closed (start and end both included) + + By default, mode=1 and only start is included in the output. + """ + mode = 1 # Default mode is half-open. + n = len(args) + if n == 1: + args = (0.0, args[0], 1.0) + elif n == 2: + args = args + (1.0,) + elif n == 4: + mode = args[3] + args = args[0:3] + elif n != 3: + raise TypeError('frange expects 1-4 arguments, got %d' % n) + assert len(args) == 3 + try: + start, end, step = [a + 0.0 for a in args] + except TypeError: + raise TypeError('arguments must be numbers') + if step == 0.0: + raise ValueError('step must not be zero') + if not isinstance(mode, int): + raise TypeError('mode must be an int') + if mode & 1: + i, x = 0, start + else: + i, x = 1, start+step + if step > 0: + if mode & 2: + from operator import le as comp + else: + from operator import lt as comp + else: + if mode & 2: + from operator import ge as comp + else: + from operator import gt as comp + while comp(x, end): + yield x + i += 1 + x = start + i*step + + # http://code.activestate.com/recipes/66472/ -def frange(start, end=None, inc=None): +def frange_(start, end=None, inc=None): "A range function, that does accept float increments..." if end == None: