У меня есть:
for i in range(2,n):
if(something):
do something
else:
do something else
i = 2 **restart the loop
Но это не работает. Есть ли способ перезапустить этот цикл?
Спасибо
У меня есть:
for i in range(2,n):
if(something):
do something
else:
do something else
i = 2 **restart the loop
Но это не работает. Есть ли способ перезапустить этот цикл?
Спасибо
Вы можете захотеть использовать другой тип цикла, где эта логика применима, потому что это самый очевидный ответ.
возможно a:
i=2
while i < n:
if something:
do something
i += 1
else:
do something else
i = 2 #restart the loop
Изменение индексной переменной 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
).
Вот пример с использованием генератора 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
Просто хотел опубликовать альтернативу, которая может быть более пригодной для использования в будущем. Большинство существующих решений используют индекс цикла, чтобы избежать этого. Но вам не нужно использовать индекс - ключ здесь заключается в том, что в отличие от цикла 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()
Это не так чисто, но все же сохраняет возможность писать на итератор цикла.
Обычно, когда вы думаете, что хотите это сделать, ваш алгоритм ошибочен, и вы должны переписать его более чисто. Вероятно, вы действительно хотите использовать генератор/сопрограмму вместо этого. Но это, по крайней мере, возможно.
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.