26

I can make simple for loops in python like:

for i in range(10):

However, I couldn't figure out how to make more complex ones, which are really easy in c++.

How would you implement a for loop like this in python:

for(w = n; w > 1; w = w / 2)

The closest one I made so far is:

for w in reversed(range(len(list)))
1
  • reversed(range(len(list)) will not halve the w value. You can use a list comprehension in place of range(10). Or else, use a while loop! Commented Jul 30, 2013 at 10:17

6 Answers 6

47
for i in range(0, 10, 2):
    print(i)

>>> 0
>>> 2
>>> 4
>>> 6
>>> 8

http://docs.python.org/2/library/functions.html

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]
Sign up to request clarification or add additional context in comments.

4 Comments

its not exactly what I am looking for
yeah, it's something about How to use range .
In addition, I think we need use python in python's way, not adapt to C's way. ^.^
what I would have liked to do is a loop that's necessary for me to proceed with a particular problem. as I couldn't do it in python I showed you how it would have looked in c. ^.^
17

First and foremost: Python for loops are not really the same thing as a C for loop. They are For Each loops instead. You iterate over the elements of an iterable. range() generates an iterable sequence of integers, letting you emulate the most common C for loop use case.

However, most of the time you do not want to use range(). You would loop over the list itself:

for elem in reversed(some_list):
    # elem is a list value

If you have to have a index, you usually use enumerate() to add it to the loop:

for i, elem in reversed(enumerate(some_list)):
    # elem is a list value, i is it's index in the list

For really 'funky' loops, use while or create your own generator function:

def halved_loop(n):
    while n > 1:
        yield n
        n //= 2

for i in halved_loop(10):
    print i

to print 10, 5, 2. You can extend that to sequences too:

def halved_loop(sequence):
    n = -1
    while True:
        try:
            yield sequence[n]
        except IndexError:
            return
        n *= 2

for elem in halved_loop(['foo', 'bar', 'baz', 'quu', 'spam', 'ham', 'monty', 'python']):
    print elem

which prints:

python
monty
spam
foo

3 Comments

isn't it possible in inline?
@gen: it is, with a while loop. I am illustrating how you can force this into a for loop anyway by building a generator.
@gen: Why the fascination with for loops? Python for loops are really for each loops; they are not the same thing as a C for loop.
6

For your exact example, you probably wouldn't use a for loop at all, but a while loop:

w = n
while w > 1:
    do stuff
    w = w / 2

Comments

3

You need to use a generator. You could implement this as follows:

def stepDown(n):
    while n>1:
        yield n
        n = n/2

for i in stepDown(n):
    print i # or do whatever else you wish.

Note that this generalizes easily to other complicated patterns you may have in mind.

Comments

3

For the more general case, you could create a custom generator function, that takes a start, stop, and a function for generating the next step from the last:

def my_range(start, stop, f):
    x = start
    while x < stop if stop > start else x > stop:
        yield x
        x = f(x)

>>> list(my_range(1, 1024, lambda x: x*2))
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

>>> list(my_range(1000, 1, lambda x: x/2))
[1000, 500.0, 250.0, 125.0, 62.5, 31.25, 15.625, 7.8125, 3.90625, 1.953125]

Comments

1

Something like for i in [n/(2**j) for j in range(int(math.log(n))+1)]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.