views:

225

answers:

4

What is the best way of doing this in Python?

for (v = n / 2 - 1; v >= 0; v--)

I actually tried Google first, but as far as I can see the only solution would be to use while.

+14  A: 

The way to do it is with xrange():

for v in xrange(n // 2 - 1, -1, -1):

(Or, in Python 3.x, with range() instead of xrange().) // is flooring division, which makes sure the result is a whole number.

Thomas Wouters
A: 
for v in xrange(n/2 - 1, 0, -1):
   #your code here

Where v and n are ints or treated as ints. This means that the division will be an integer division, i.e., 1/2 == 0 is True.

Note: This is for Python 2.x .

Chinmay Kanchi
+7  A: 
for v in range(n//2, -1, -1)

However, in 90% of the cases when you would have used a for loop in C/Java/C#/VB, what you really want is list comprehension:

listOfStuff = [doSomethingWith(v) for v in range(n//2, -1, -1)]
BlueRaja - Danny Pflughoeft
+12  A: 

I would do this:

for i in reversed(range(n // 2)):
    # Your code
    pass

It's a bit clearer that this is a reverse sequence, what the lower limit is, and what the upper limit is.

hughdbrown
or `reversed(xrange(…))`, that works too.
ΤΖΩΤΖΙΟΥ
+1 I like this best
BlueRaja - Danny Pflughoeft
@ ΤΖΩΤΖΙΟΥ: true, but this does not have the benefit you may think. range() in pre-3.0 pythons pulls all the data at once. xrange() acts like a generator, pulling only one item at a time. But if you are going to reverse a sequence, you need all the data at once, so reversed(range()) and reversed(xrange()) will work in the same way: they'll each have all the data pulled before it is reversed.
hughdbrown
I actually ended up using this, big thanks! A follow-up question: I know I've seen it, but how do I print a `range()` (an iterator I guess)? Edit: thanks hughdbrown for the performance note, I'll consider that in more complex applications
Znarkus
@hughdbrown: it does have the benefit you think I might be thinking. Check the `dir(xrange)` output and note the `__reversed__` special method.
ΤΖΩΤΖΙΟΥ
@ ΤΖΩΤΖΙΟΥ: The things I learn. http://docs.python.org/library/functions.html#reversed explains that `reversed` can consume `__reversed__` method if present -- so that `xrange()` could be implemented optimally, as ΤΖΩΤΖΙΟΥ suggests. See also: http://www.python.org/dev/peps/pep-0322/
hughdbrown