# Arithmetic sequences in Python

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

```Op 2006-01-16, Gregory Petrosyan schreef <gregory.petrosyan at gmail.com>:
>
> 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
> 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

```