Предположим, что у меня есть цикл for:
for i in range(1,10):
if i is 5:
i = 7
Я хочу изменить i
, если он соответствует определенному условию. Я пробовал это, но не работал.
Как мне это сделать?
Предположим, что у меня есть цикл for:
for i in range(1,10):
if i is 5:
i = 7
Я хочу изменить i
, если он соответствует определенному условию. Я пробовал это, но не работал.
Как мне это сделать?
В вашем конкретном примере это будет работать:
for i in range(1, 10):
if i in (5, 6):
continue
Однако вам, вероятно, будет лучше с циклом while
:
i = 1
while i < 10:
if i == 5:
i = 7
# other code
i += 1
Цикл A for
присваивает переменную (в данном случае i
) следующему элементу в списке /iterable в начале каждой итерации. Это означает, что независимо от того, что вы делаете внутри цикла, i
станет следующим элементом. Цикл while
не имеет такого ограничения.
Немного больше о том, почему цикл в вопросе не работает должным образом.
Цикл
for i in iterable:
# some code with i
является в основном сокращением для
iterator = iter(iterable)
while True:
try:
i = next(iterator)
except StopIteration:
break
# some code with i
Таким образом, цикл for
извлекает значения из итератора, построенного из итерируемого по одному, и автоматически распознает, когда этот итератор исчерпан и останавливается.
Как вы можете видеть, на каждой итерации цикла while
я переназначается, поэтому значение i
будет переопределено независимо от любых других переназначений, которые вы выдаете в # some code with i
часть.
По этой причине петли for
в Python не подходят для постоянных изменений в переменной цикла, и вам следует прибегнуть к циклу while
, как уже было показано в ответе Volatility.
Эта концепция не является необычной в мире C, но ее следует избегать, если это возможно. Тем не менее, именно так я его реализовал, и я чувствовал, что это ясно, что происходит. Затем вы можете поместить свою логику для проскакивания вперед в индексе в любом месте цикла, и читатель будет знать, чтобы обратить внимание на переменную пропуска, тогда как вложение я = 7 где-то глубоко можно пропустить:
skip = 0
for i in range(1,10):
if skip:
skip -= 1
continue
if i=5:
skip = 2
<other stuff>