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

у меня есть:

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

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

Спасибо


person cbrulak    schedule 29.01.2009    source источник


Ответы (5)


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

возможно:

i=2
while i < n:
    if something:
       do something
       i += 1
    else: 
       do something else  
       i = 2 #restart the loop  
person gnomed    schedule 29.01.2009
comment
Просто напоминание: с циклом while убедитесь, что у вас есть условие завершения, которое всегда может быть выполнено. - person Brandon; 29.01.2009
comment
Я думаю, что это прекратится, когда i›=n - person gnomed; 29.01.2009
comment
Но ничто не мешает мне продолжать сбрасывать до 2 на неопределенный срок, в зависимости от проверки, если что-то. - person Brandon; 29.01.2009
comment
Значит, это больше зависит от if-теста, чем от инварианта цикла? Есть ли другое решение, которое позволяет избежать этого, оставаясь при этом простым (потому что простота является ключевым моментом)? Не будет ли всегда один и тот же риск в любой петле с возможностью перезапуска? - person gnomed; 30.01.2009

Изменение индексной переменной 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).

person Greg Hewgill    schedule 29.01.2009

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

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
person Joel Cornett    schedule 10.01.2014

Просто хотел опубликовать альтернативу, которая может быть более универсальной. Большинство существующих решений используют циклический индекс, чтобы избежать этого. Но вам не нужно использовать индекс — ключ здесь в том, что в отличие от цикла 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()

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

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

person Corley Brigman    schedule 10.01.2014

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.

person BrunoC7    schedule 16.02.2016