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)))
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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]
Method 2
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
Method 3
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
Method 4
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.
Method 5
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]
Method 6
Something like for i in [n/(2**j) for j in range(int(math.log(n))+1)]
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0