Как пропустить несколько итераций в цикле for
В python я обычно просматриваю диапазоны просто
for i in range(100):
#do something
но теперь я хочу пропустить несколько шагов в цикле. В частности, я хочу что-то вроде continue(10)
, чтобы он пропускал весь цикл и увеличивал счетчик на 10. Если бы я использовал цикл for в C, я бы просто составил 10 до i
, но в Python, который не работает "Действительно работаю.
Ответы
Ответ 1
Вы не можете изменить целевой список (i
в этом случае) цикла for
. Вместо этого используйте цикл while
:
while i < 10:
i += 1
if i == 2:
i += 3
В качестве альтернативы используйте итерабельность и приращение, которые:
from itertools import islice
numbers = iter(range(10))
for i in numbers:
if i == 2:
next(islice(numbers, 3, 3), None) # consume 3
Назначая результат iter()
локальной переменной, мы можем продвигать последовательность цикла внутри цикла, используя стандартные инструменты итерации (next()
или здесь сокращенная версия рецепта потребления itertools
). for
обычно вызывает iter()
для нас при переходе по итератору.
Ответ 2
Лучший способ - присвоить итератору имя - обычно он имеет итерабельность, а не итератор (различие, являющееся итерируемым - например, список - начинается с самого начала каждый раз, когда вы перебираете его). В этом случае просто используйте встроенную функцию iter()
:
numbers = iter(range(100))
Затем вы можете продвинуть его в цикле, используя имя. Лучший способ сделать это - itertools
consume()
recipe - как быстро (он использует функции itertools
, чтобы гарантировать, что делает процесс потребления значений очень быстрым и позволяет избежать использования памяти, сохраняя потребляемые значения):
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)
Сделав это, вы можете сделать что-то вроде:
numbers = iter(range(100))
for i in numbers:
...
if some_check(i):
consume(numbers, 3) # Skip 3 ahead.
Ответ 3
Почему бы просто не пропустить значение, пока? Как:
skip_until = 0
for i in range(100):
if i < skip_until:
continue
if SOME_CONDITION:
skip_until = i + 10
DO_SOMETHING()
где SOME_CONDITION - это то, что вам нужно пропустить, и DO_SOMETHING() - это фактическое содержимое цикла?
Ответ 4
for i in range(0, 100, 10):
print(i)
будет печатать 0, 10, 20...