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

Python: перезапуск цикла

У меня есть:

for i in range(2,n):
    if(something):
       do something
    else:
       do something else
       i = 2 **restart the loop

Но это не работает. Есть ли способ перезапустить этот цикл?

Спасибо

4b9b3361

Ответ 1

Вы можете захотеть использовать другой тип цикла, где эта логика применима, потому что это самый очевидный ответ.

возможно a:

i=2
while i < n:
    if something:
       do something
       i += 1
    else: 
       do something else  
       i = 2 #restart the loop  

Ответ 2

Изменение индексной переменной i изнутри цикла вряд ли будет делать то, что вы ожидаете. Возможно, вам понадобится использовать цикл while, а также управлять приростом переменной цикла. Каждый раз вокруг цикла for i переназначается со следующим значением из range(). Так что-то вроде:

i = 2
while i < n:
    if(something):
        do something
    else:
        do something else
        i = 2 # restart the loop
        continue
    i += 1

В моем примере оператор continue перескакивает обратно в начало цикла, пропуская оператор i += 1 для этой итерации, В противном случае i увеличивается, как и следовало ожидать (аналогично циклу for).

Ответ 3

Вот пример с использованием генератора send() method:

def restartable(seq):
    while True:
        for item in seq:
            restart = yield item
            if restart:
                break
        else:
            raise StopIteration

Пример использования:

x = [1, 2, 3, 4, 5]
total = 0
r = restartable(x)
for item in r:
    if item == 5 and total < 100:
        total += r.send(True) 
    else:
        total += item

Ответ 4

Просто хотел опубликовать альтернативу, которая может быть более пригодной для использования в будущем. Большинство существующих решений используют индекс цикла, чтобы избежать этого. Но вам не нужно использовать индекс - ключ здесь заключается в том, что в отличие от цикла for, где переменная цикла скрыта, отображается переменная цикла.

Вы можете делать очень похожие вещи с помощью итераторов/генераторов:

x = [1,2,3,4,5,6]
xi = iter(x)
ival = xi.next()
while not exit_condition(ival):
    # Do some ival stuff
    if ival == 4:
        xi = iter(x)
    ival = xi.next()

Это не так чисто, но все же сохраняет возможность писать на итератор цикла.

Обычно, когда вы думаете, что хотите это сделать, ваш алгоритм ошибочен, и вы должны переписать его более чисто. Вероятно, вы действительно хотите использовать генератор/сопрограмму вместо этого. Но это, по крайней мере, возможно.

Ответ 5

a = ['1', '2', '3']
ls = []
count = False

while ls != a :
    print(a[count])
    if a[count] != a[-1] :
        count = count + 1
    else :
        count = False

Перезапустить цикл while.