у меня есть:
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
Но это, кажется, не работает. Есть ли способ перезапустить этот цикл?
Спасибо
Вы можете рассмотреть возможность использования другого типа цикла, где применима эта логика, потому что это наиболее очевидный ответ.
возможно:
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()
генератора:
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.