2013-02-09 6 views
29

Supponiamo che io sono un ciclo for:Come cambiare l'indice di for loop in Python?

for i in range(1,10): 
    if i is 5: 
     i = 7 

voglio cambiare i se soddisfa determinate condizioni. Ho provato questo ma non ha funzionato. Come faccio?

+2

Usa un ciclo 'while', invece di' is' usa '=='. –

+1

Perché si desidera modificare l'indice di iterazione? Questo è decisamente un odore. –

+0

Sto scrivendo qualcosa come un interprete di codice assembly. Quindi devo passare a certe istruzioni a causa della mia implementazione. – drum

risposta

48

Per esempio particolare, questo sistema funziona:

for i in range(1, 10): 
    if i in (5, 6): 
     continue 

Tuttavia, si sarebbe probabilmente meglio con un while ciclo:

i = 1 
while i < 10: 
    if i == 5: 
     i = 7 
    # other code 
    i += 1 

Un ciclo for assegna una variabile (in questo caso i) al successivo elemento nell'elenco/iterabile all'inizio di ogni iterazione. Ciò significa che, indipendentemente da ciò che fai all'interno del ciclo, i diventerà l'elemento successivo. Il ciclo while non ha tale restrizione.

+1

È questo l'unico modo? Sembra un po 'disordinato. – drum

+17

@drum: volendo modificare manualmente l'indice di loop dall'interno del loop, ci si sente in disordine. – BrenBarn

+2

Con un 'while', almeno, non lo confondiamo per un ciclo" regolare "che itera su un intervallo che promette di ripetere. –

1

Questo concetto non è insolito nel mondo C, ma dovrebbe essere evitato se possibile. Tuttavia, questo è il modo in cui l'ho implementato, in un modo in cui sentivo che era chiaro cosa stava succedendo. Poi si può mettere la vostra logica per il salto in avanti nell'indice qualsiasi punto all'interno del ciclo, e un lettore di saprete di prestare attenzione alla variabile di salto, mentre incorporando un i = 7 qualche parte nel profondo può facilmente perdere:

skip = 0 
for i in range(1,10): 
    if skip: 
     skip -= 1 
     continue 

    if i=5: 
     skip = 2 

    <other stuff> 
+1

Anche se saltare è un'opzione, non è sicuramente la risposta appropriata a questa domanda.Secondo la domanda, si dovrebbe anche poter andare avanti e indietro in un ciclo. La risposta accettata ha affrontato questo problema con un ciclo di tempo. – drum

3

Un po 'più di informazioni sul perché il ciclo nella domanda non funziona come previsto.

Un ciclo

for i in iterable: 
    # some code with i 

è fondamentalmente un'abbreviazione per

iterator = iter(iterable) 
while True: 
    try: 
     i = next(iterator)    
    except StopIteration: 
     break 
    # some code with i 

Così il ciclo for estrae i valori da un iteratore costruito da quello iterable per uno e automaticamente riconosce quando che iteratore esausto e si ferma.

Come si può vedere, in ogni iterazione del ciclo whilei è riassegnata, quindi il valore di i verrà sostituita indipendentemente da qualsiasi altra riassegnazioni si immette nella parte # some code with i.

Per questo motivo, for loop in Python non sono adatti per le modifiche permanenti alla variabile del ciclo e si dovrebbe ricorrere a un ciclo while invece, come è già stato dimostrato in risposta di volatilità.