Подтвердить что ты не робот

Как изменить индекс цикла for в Python?

Предположим, что у меня есть цикл for:

for i in range(1,10):
    if i is 5:
        i = 7

Я хочу изменить i, если он соответствует определенному условию. Я пробовал это, но не работал. Как мне это сделать?

4b9b3361

Ответ 1

В вашем конкретном примере это будет работать:

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 не имеет такого ограничения.

Ответ 2

Немного больше о том, почему цикл в вопросе не работает должным образом.

Цикл

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.

Ответ 3

Эта концепция не является необычной в мире C, но ее следует избегать, если это возможно. Тем не менее, именно так я его реализовал, и я чувствовал, что это ясно, что происходит. Затем вы можете поместить свою логику для проскакивания вперед в индексе в любом месте цикла, и читатель будет знать, чтобы обратить внимание на переменную пропуска, тогда как вложение я = 7 где-то глубоко можно пропустить:

skip = 0
for i in range(1,10):
   if skip:
      skip -= 1
      continue

   if i=5:
      skip = 2

   <other stuff>