2010-08-19 5 views
5

Se voglio iterare n volte in Java, scrivo:C'è un modo per iterare un numero specificato di volte senza introdurre una variabile non necessaria?

for (i = 0; i < n; i++) { 
    // do stuff 
} 

In Python, sembra che il modo standard per fare questo è:

for x in range(n): 
    # do stuff 

Come sempre, Python è più conciso e più leggibile. Ma lo x mi dà fastidio, poiché non è necessario e PyDev genera un avviso, dal momento che x non viene mai utilizzato.

C'è un modo per farlo che non genera alcun avviso e non introduce variabili non necessarie?

+1

Perché il 'i' in Java non ti dà fastidio? –

+0

@ S.Lott Non ho detto che il 'i' non mi infastidisce. Mi piace la sintassi Python, come al solito. Ma c'è il fatto che il 'i' in Java sembra essere usato, e io non sono sgridato per non usarlo nel ciclo. –

+0

Il 'i' potrebbe non essere effettivamente utilizzato. Quindi è il "rimprovero"? È questo il problema? –

risposta

6

Idiomatic Python (e molte altre lingue) dovrebbe utilizzare _ come variabile temporanea, che in genere indica ai lettori che la variabile è intenzionalmente inutilizzata.

A parte questa convenzione, il costrutto del ciclo in in Python richiede sempre di eseguire un'iterazione su qualcosa e assegnare tale valore a una variabile.

(I commenti nella risposta accettata di this question suggeriscono che PyDev non creerà un avviso per _).

2

In Python, non si crea una variabile aggiuntiva nel tipo di situazione descritta.

for i in range(10): 

Crea un oggetto intervallo, su cui il ciclo itera. L'oggetto intervallo mantiene il valore corrente in qualsiasi momento. i è semplicemente un nome creato e associato a questo valore.

La variabile esiste se ha un nome o meno, poiché l'oggetto intervallo deve conoscere il suo valore corrente.

Se si pensa a un ciclo in termini di istruzioni della CPU, si vede il motivo per cui ci deve essere una variabile:

push x 
loop: 
    do something 
    increment x 
    jump if x > y 
    goto loop 

V'è una struttura in alcune lingue JIT compilato che a volte rileva un ciclo di essere solo un piccolo quantità di ripetizioni dello stesso codice e ottimizza il codice per essere una serie delle stesse istruzioni. Ma, per quanto ne so, Python non fa nulla del genere.

Ecco un ciclo for in bytecode:

4   0 SETUP_LOOP    20 (to 23) 
       3 LOAD_GLOBAL    0 (range) 
       6 LOAD_FAST    0 (x) 
       9 CALL_FUNCTION   1 
      12 GET_ITER    
     >> 13 FOR_ITER     6 (to 22) 
      16 STORE_FAST    1 (i) 

    5   19 JUMP_ABSOLUTE   13 
     >> 22 POP_BLOCK    

Si noti che non c'è paragone. Il ciclo viene chiuso dall'oggetto di iterazione che solleva StopIteration, l'interprete cerca la configurazione del loop e salta alla fine del loop (23 in questo caso).

Ovviamente è possibile evitare tutto ciò semplicemente ripetendo il codice x numero di volte. Non appena questo numero può variare, ci deve essere una sorta di possibilità per fornire next() e StopIteration affinché il ciclo for funzioni.Ricorda, python's for-loop è qualcosa di simile a un ciclo for-each in Java. Non c'è davvero un ciclo tradizionale disponibile a tutti.

Solo a parte: Io uso sempre i, j e k per le variabili iterating. Usare il trattino basso sembra in qualche modo inelegante per me.

Problemi correlati