Arithmetic sequences in Python

Antoon Pardon apardon at forel.vub.ac.be
Wed Jan 18 10:12:31 CET 2006


Op 2006-01-16, Gregory Petrosyan schreef <gregory.petrosyan at gmail.com>:
> Please visit http://www.python.org/peps/pep-0204.html first.
>
> As you can see, PEP 204 was rejected, mostly because of not-so-obvious
> syntax. But IMO the idea behind this pep is very nice. So, maybe
> there's a reason to adopt slightly modified Haskell's syntax? Something
> like
>
> [1,3..10]  -->  [1,3,5,7,9]
> (1,3..10)  -->  same values as above, but return generator instead of
> list
> [1..10]     -->  [1,2,3,4,5,6,7,8,9,10]
> (1 ..)        -->  'infinite' generator that yield 1,2,3 and so on
> (-3,-5 ..)   -->  'infinite' generator that yield -3,-5,-7 and so on
>
> So,
> 1) "[]" means list, "()" means generator
> 2) the "start" is required, "step" and "end" are optional.
>
> Also, this can be nicely integrated with enumerations (if they will
> appear in python). Haskell is also example of such integration.

With some abuse of the language one can already do a number of things
in python2.4 now.

import sys
from types import SliceType

class vslice(object):

    def __init__(self, fun):
        self.fun = fun

    def __getitem__(self, inx):
        if not isinstance(inx, tuple):
          inx = inx,
        return self.fun(*inx)

@vslice
def rnglst(*arg):
    lst = []
    for el in arg:
        if type(el) is SliceType:
            start = el.start or 0
            stop = el.stop or sys.maxint
            step = el.step or 1
            if step > 0:
                while start < stop:
                    lst.append(start)
                    start += step
            else:
                while start > stop:
                    lst.append(start)
                    start += step
        else:
            lst.append(el)
    return lst
 
rnglst[3,4,5] --> [3, 4, 5]
rnglst[1, 2:8] --> [1, 2, 3, 4, 5, 6, 7]
rnglst[3:9:2, 21:6:-3] --> [3, 5, 7, 21, 18, 15, 12, 9]

-- 
Antoon Pardon




More information about the Python-list mailing list