2013-07-15 4 views
12

In Python hai due ottimi modi per ripetere un'azione più volte. Uno di questi è il ciclo while e l'altro - il ciclo for. Quindi cerchiamo di avere uno sguardo su due semplici pezzi di codice:per o mentre il ciclo fa qualcosa n volte

for i in range(n): 
    do_sth() 

e l'altro:

i = 0 
while i < n: 
    do_sth() 
    i += 1 

La mia domanda è: quale di essi è meglio. Naturalmente, il primo, che è molto comune negli esempi di documentazione e vari pezzi di codice che si possono trovare su Internet, è molto più elegante e più breve, ma d'altra parte crea un elenco di interi completamente inutile solo per passare in rassegna loro. Non è uno spreco di memoria, specialmente per quanto riguarda un gran numero di iterazioni?

Quindi cosa ne pensi, qual è il modo migliore?

+0

Possibile duplicato di [Come ripetere una funzione n volte] (http://stackoverflow.com/questions/7359828/how-to-repeat-a-function-n-times) –

risposta

21

ma d'altra parte crea una lista di interi interi completamente inutile solo per il loro loop. Non è uno spreco di memoria, specialmente per quanto riguarda un gran numero di iterazioni?

Questo è ciò che è xrange(n). Evita di creare un elenco di numeri e invece fornisce solo un oggetto iteratore.

In Python 3, xrange() stato rinominato in range() - se si desidera un elenco, è necessario richiedere specificamente via list(range(n)).

+0

Nella tua ultima frase, penso vuoi dire 'lista (range (n))' – SethMMorton

+1

Mi piacerebbe notare che, sebbene meno efficiente in termini di memoria (senza 'xrange'), il ciclo for è molto più veloce, non ci sono confronti e aggiunte extra. –

+0

Buono a sapersi tutto questo! Grazie mille. :) – Sventimir

11

È più leggero dello xrange (e del ciclo while) poiché non è nemmeno necessario creare gli oggetti int. Funziona altrettanto bene in python2 e python3

from itertools import repeat 
for i in repeat(None, 10): 
    do_sth() 
+0

Richiede l'importazione di itertools d'altra parte, il che è un po 'scomodo. La risposta di Amber sembra migliore. – Sventimir

+6

È scomodo per il codice golf. Non sono sicuro del motivo per cui la gente pensa che l'importazione sia una sorta di problema. Oltre ai programmi reali ci sono un sacco di importazioni e itertools ha un sacco di cose che dovresti usare comunque. –

+0

Bene, presumo che quando si potesse fare qualcosa con il linguaggio base ugualmente buono come con un modulo, allora perché importare?Itertools è estremamente utile per determinati scopi, vero, ma posso immaginare che molti script Python funzionino bene senza di esso. Ecco perché è un modulo e non core Python. :) – Sventimir

2

La differenza fondamentale nella maggior parte dei linguaggi di programmazione è che a meno l'imprevisto accade un ciclo for saranno sempre ripetere n volte poi finire con un ciclo while può ripetere 0 times, 1, more or even forever, a seconda di una determinata condizione che è sempre true all'inizio di ogni ciclo e sempre false all'uscita dal ciclo, (per completezza un ciclo do ... while, (o repeat until), per le lingue che lo hanno, viene sempre eseguito almeno una volta e non garantire la condizione sul primo ex ecution).

Quindi la risposta alla tua domanda è 'dipende tutto da cosa stai cercando di fare'!