In Python 2.7 I want to modify the step of a
for loop in function of the specifics conditions satisfied in the loop. Something like this:
step = 1 for i in range(1, 100, step): if ...... : step = 1 #do stuff else: step = 2 #do other stuff
but it seems that this can’t be done,
step is always 1.
You could add a skip check:
skip = 0 for i in range(1, 100): if skip != 0: skip -= 1 continue if ...... : #do stuff else: skip = 1 #do other stuff
You could do it with a while loop:
step = 1 i = 1 while i < 100: if ...... : step = 1 #do stuff else: step = 2 #do other stuff i+=step
you would need to increment
step manually which can be done using a
while loop. checkout difference between
The for statement iterates through a collection or iterable object or
The while statement simply loops until a condition is False.
if you use a
while loop your code would look something like this:
step = 1 i = 1 while i < 100: if ...... : step = 1 #do stuff else: step = 2 #do other stuff i = i + step
If you want to over-complicate things, you could create a custom generator where you can use the
generator.send method to pass in a new step during iteration.
def variable_step_generator(start, stop=None, step=1): if stop is None: start, stop = 0, start while start < stop: test_step = yield start if test_step is not None: step = test_step yield start += step
With usage like:
variable_step_range = variable_step_generator(1, 100) for i in variable_step_range: print i if i == 10: variable_step_range.send(10) if i == 90: variable_step_range.send(1) # 1, 2, 3, 4, 5, 6, 7, 8, 9, # 10, 20, 30, 40, 50, 60, 70, 80, 90, # 91, 92, 93, 94, 95, 96, 97, 98, 99
But this isn’t really much more than a wrapper around the
while loop that the other answers suggest.
The second line of your code creates a range object that is then used for the rest of the loop, and your code doesn’t modify that range object. And even if you did change the step, that wouldn’t change just the next element of the range, it would change the whole range object (that is, changing the step to 2 would make every element in the range 2 more than the previous). If you really want to, you can create a named object and modify it within the for loop, but that would be a rather messy thing to do.
You can also use another index separate from the main for loop one. For instance:
actual_index = 1 for for_loop_index in range(1,100): if condition1: actual_index = actual_index + 1 if condition2: actual_index = actual_index + 2 if actual_index > 99: break
This would basically be a while loop, except with a hard limit on the number of iterations, which could be useful in some use cases.
np.arrange creates a (numpy) array with increasing values. The for-loop goes through all the values of the array. (Numpy is a powerful library for computations with numerical arrays)
import numpy as np for i in np.arange(start,stop,stepwidth): # your stuff