python for loop

Carl Banks pavlovevidence at gmail.com
Wed Apr 1 18:35:36 EDT 2009


On Apr 1, 2:32 pm, Arnaud Delobelle <arno... at googlemail.com> wrote:
> Lada Kugis <lada.ku... at gmail.com> writes:
> > I'm coming from fortran and c background so I'm certainly biased by
> > them. But if you could explain one thing to me:
>
> > in fortran for example:
> > for i=1,n
> > goes from 1,2,3,4,...,n
>
> > in python for example:
> > for i in range(1,n)
> > goes from 1,2,3,4,...,n-1
> > (that is, it goes from 1 up to, but not including n)
>
> > Why is that so ? What were the reasons for that "not including" part ?
> > It troubles me greatly, and I cannot see it's advantages over the
> > "standard" "up to and including" n.
>
> > Best regards
> > Lada
>
> Luckily Python allows you to create your own indexing on lists:
>
> def dec(i):
>     if isinstance(i, slice):
>         return slice(dec(i.start), dec(i.stop), i.step)
>     elif i is None or i < 0:
>         return i
>     else:
>         return i - 1
>
> defop = """
> def __%sitem__(s,i,*r):
>     val = list.__%sitem__(s,dec(i),*r)
>     if isinstance(i, slice): val = List1(val)
>     return val
> def __%sslice__(s,i,j,*r):
>     return List1(list.__%sslice__(s,dec(i),dec(j),*r))
> """
>
> class List1(list):
>     for op in 'del', 'get', 'set':
>         exec defop % (op, op, op, op)
>     def index(self, x):
>         return list.index(self, x) + 1
>     def insert(self, i, x):
>         list.insert(self, dec(i), x)
>     def pop(self, i=None):
>         return list.pop() if i is None else list.pop(dec(i))
>     for op in 'add', 'mul', 'radd', 'rmul':
>         exec "def __%s__(*r): return List1(list.__%s__(*r))" % (op, op)
>
> l1 = List1(range(10))
> l2 = List1("Python rules")
>
> I'll let you play with l1 and l2.

If I were your boss and you ever pulled something like this, your ass
would be so fired.

This is unforgiveable, not only changing the indexing semantics of
Python (because a user would have NO CLUE that something underlying
has been changed, and thus it should never be done), but also for the
needless abuse of exec.


Carl Banks



More information about the Python-list mailing list