why I don't like range/xrange
Larry Bates
lbates at websafe.com
Fri Feb 16 11:16:44 EST 2007
stdazi wrote:
> Hello!
>
> Many times I was suggested to use xrange and range instead of the
> while constructs, and indeed, they are quite more elegant - but, after
> calculating the overhead (and losen flexibility) when working with
> range/xrange, and while loops, you get to the conclusion that it isn't
> really worth using range/xrange loops.
>
> I'd like to show some examples and I'll be glad if someone can suggest
> some other fixes than while a loop :-)
>
> a) range overfllow :
>
>
> for i in range(0, 1 << len(S)) :
> .....
> OverflowError: range() result has too many items
>
> ok, so we fix this one with xrange !
>
> b) xrange long int overflow :
>
> for i in xrange(0, 1 << len(S)) :
> ........
> OverflowError: long int too large to convert to int
>
> Next thing I miss is the flexibility as in C for loops :
>
> for (i = 0; some_function() /* or other condition */ ; i++)
>
> or,
>
> for (i = 0 ; i < 10 ; i++)
> i = 10;
>
>
> I don't think range/xrange sucks, but I really think there should be
> some other constructs to improve the looping flexibility. Other thing
> may be, that I just miss an equally elegant alternative that's why I'd
> like to hear some suggestions on how to fix the above issues.. (btw,
> I've already browsed the archives related to my issue,but i don't see
> any good solution)
>
> Thanks
>
> Jernej.
>
Your example of for i in xrange(0, 1<<len(s)): must have resulted in
a number greater than 1 billion. Are you really doing this much or
are you just pointing out an edge case here?
You can always use while loop:
i=0
while i < (1<<len(s)):
i+=1
or
i=1
while 1:
if i == 10: break
i+=1
Personally I use a lot of for loops in my code where I iterate
over lists or with a generator as my target that returns instances
of my data until exhausted and find the code easy to read:
for line in myfile:
# do something with the line
No need to even "think" about numbers here unless I want to keep
track of the line numbers in which case I would do:
for linenumber, line in enumerate(myfile):
# do something with each linenumber, line
I find that I use i, j, k pointers less and less as I write more code in
Python. I guess it is just what you get accustomed to using.
-Larry
More information about the Python-list
mailing list