Python: перезапуск цикла
У меня есть:
for i in range(2,n):
if(something):
do something
else:
do something else
i = 2 **restart the loop
Но это не работает. Есть ли способ перезапустить этот цикл?
Спасибо
Ответы
Ответ 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.