питон: перезапуск цикла - PullRequest
       18

питон: перезапуск цикла

16 голосов
/ 29 января 2009

у меня есть:

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

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

Спасибо

Ответы [ 5 ]

29 голосов
/ 29 января 2009

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

возможно:

i=2
while i < n:
    if something:
       do something
       i += 1
    else: 
       do something else  
       i = 2 #restart the loop  
13 голосов
/ 29 января 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).

3 голосов
/ 10 января 2014

Вот пример использования метода 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
1 голос
/ 10 января 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()

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

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

0 голосов
/ 16 февраля 2016
a = ['1', '2', '3']
ls = []
count = False

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...