In python I usually loop through ranges simply by
for i in range(100):
#do something
but now I want to skip a few steps in the loop. More specifically, I want something like continue(10)
so that it would skip the whole loop and increase the counter by 10. If I were using a for loop in C I'd just sum 10 to i
, but in Python that doesn't really work.
Using next() this way can raise a StopIteration exception, if the iterable is out of values. The islice(song_iter, 3, 4) iterable will skip 3 elements, then return the 4th, then be done. Calling next() on that object thus retrieves the 4th element from song_iter() .
Just add # at the beginning of all the lines you want to skip.
You cannot alter the target list (i
in this case) of a for
loop. Use a while
loop instead:
while i < 10: i += 1 if i == 2: i += 3
Alternatively, use an iterable and increment that:
from itertools import islice numbers = iter(range(10)) for i in numbers: if i == 2: next(islice(numbers, 3, 3), None) # consume 3
By assigning the result of iter()
to a local variable, we can advance the loop sequence inside the loop using standard iteration tools (next()
, or here, a shortened version of the itertools
consume recipe). for
normally calls iter()
for us when looping over a iterator.
The best way is to assign the iterator a name - it is common have an iterable as opposed to an iterator (the difference being an iterable - for example a list - starts from the beginning each time you iterate over it). In this case, just use the iter()
built-in function:
numbers = iter(range(100))
Then you can advance it inside the loop using the name. The best way to do this is with the itertools
consume()
recipe - as it is fast (it uses itertools
functions to ensure the iteration happens in low-level code, making the process of consuming the values very fast, and avoids using up memory by storing the consumed values):
from itertools import islice import collections def consume(iterator, n): "Advance the iterator n-steps ahead. If n is none, consume entirely." # Use functions that consume iterators at C speed. if n is None: # feed the entire iterator into a zero-length deque collections.deque(iterator, maxlen=0) else: # advance to the empty slice starting at position n next(islice(iterator, n, n), None)
By doing this, you can do something like:
numbers = iter(range(100)) for i in numbers: ... if some_check(i): consume(numbers, 3) # Skip 3 ahead.
Why not just set the value to skip until? Like:
skip_until = 0
for i in range(100):
if i < skip_until:
continue
if SOME_CONDITION:
skip_until = i + 10
DO_SOMETHING()
where SOME_CONDITION is whatever causes you to skip and DO_SOMETHING() is the actual loop contents?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With