python: reiniciar um ciclo

votos
12

eu tenho:

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

Mas isso não parece funcionar. Existe uma maneira de reiniciar esse ciclo?

obrigado

Publicado 29/01/2009 em 19:37
fonte usuário
Em outras línguas...                            


5 respostas

votos
25

Você pode querer considerar o uso de um tipo diferente de loop onde essa lógica é aplicável, porque é a resposta mais óbvia.

talvez um:

i=2
while i < n:
    if something:
       do something
       i += 1
    else: 
       do something else  
       i = 2 #restart the loop  
Respondeu 29/01/2009 em 19:42
fonte usuário

votos
11

Alterar a variável índice ide dentro do laço é improvável que fazer o que você espera. Você pode precisar usar um whilelaço em vez disso, e controlar o incremento da variável de loop de si mesmo. Cada tempo em torno do forloop, ié reatribuída com o próximo valor a partir range(). Então, algo como:

i = 2
while i < n:
    if(something):
        do something
    else:
        do something else
        i = 2 # restart the loop
        continue
    i += 1

No meu exemplo, a continuedeclaração salta de volta até o topo do loop, ignorando a i += 1declaração para a iteração. Caso contrário, ié incrementado como seria de esperar (mesmo que o forloop).

Respondeu 29/01/2009 em 19:38
fonte usuário

votos
3

Aqui está um exemplo usando um gerador de send()método :

def restartable(seq):
    while True:
        for item in seq:
            restart = yield item
            if restart:
                break
        else:
            raise StopIteration

Exemplo de Uso:

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
Respondeu 10/01/2014 em 16:22
fonte usuário

votos
0
a = ['1', '2', '3']
ls = []
count = False

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

Reiniciar while.

Respondeu 16/02/2016 em 17:12
fonte usuário

votos
0

Só queria postar uma alternativa que pode ser mais genearally utilizável. A maioria das soluções existentes utilizam um índice de ciclo de evitar este. Mas você não tem que usar um índice - a chave aqui é que ao contrário de um loop, onde a variável do laço está escondido, a variável do laço está exposto.

Você pode fazer coisas muito semelhantes com iteradores / geradores:

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()

Não é tão limpo, mas ainda mantém a capacidade de escrever para o próprio iterator loop.

Normalmente , quando você pensa que você quer fazer isso, seu algoritmo é errado, e você deve reescrevê-lo de forma mais limpa. Provavelmente o que você realmente quer fazer é usar um gerador / coroutine vez. Mas é pelo menos possível.

Respondeu 10/01/2014 em 16:00
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more