PEP 284, Integer for-loops
Roy Smith
roy at panix.com
Thu Mar 7 09:13:03 EST 2002
Peter Hansen <peter at engcorp.com> wrote:
> I think I rarely use for with a range any more, because I tend to
> think "if I need to do something eight times, there are probably
> eight things I'm doing something to so I should just take those
> things and iterate over a list of them".
That's an interesting way to look at it.
I just took a look at some random collection of python code I've got laying
around, totaling 6100 lines. I've got 85 for loops, 12 of which use range,
the other 73 don't. What's even more interesting is that of the 12 ranges,
11 of them are in a single file; the only file of the collection which I
didn't write (and which I consider pretty ugly code).
I don't remember ever thinking "for x in range is bad, let me see if I can
write this some other way", it's just a result of the natural way I write
python code. I suspect if you look at some of my earlier code, you would
find a lot more range constucts in it. Paradigm shift? Gotten more used
to the language? Maybe.
I remember when I was first moving from Fortran to C, I wrote a lot of
goto's. Gradually, I evolved that way of thinking out of how I wrote code.
After many years of C, I got to the point where I would very, very
occasionally write a goto, most often when needed to do something like
break out of several nested loops at once. I *knew* gotos were evil, but
would convince myself that "yeah, in this special case, you really do need
to do that". Python doesn't even have gotos, and I don't miss them.
The one "for x in range" loop that I wrote, was a particularly bletcherous
piece of code which grovels over strings one character at a time. Even
before I did this little experiment, it's the one module I've got which I
keep saying to myself really needs to be re-written in C. I think maybe
the real problem is I wrote this piece of code like I would have written
the C version, doing very un-pythonic things like:
for i in range (len (line)):
c = line[i]
[...]
elif c.isdigit() or c == '-' or c == '.':
[...]
if c == "'":
if line[i+1:i+2] == "'":
Python may be a swiss army knife, if you try to do brain surgery with a
swiss army knife, you'll end up with poor results. I think the above code
proves that.
I've been watching the discussion of this PEP somewhat horrified because
it's a completely gratuitous change which adds nothing of significant
value. It's just another special case to confuse people trying to learn
the language. Now that I've looked at just how uncommon the "for x in
range" construct really is, I'm even more convinced the whole idea is just
plain silly.
More information about the Python-list
mailing list