2014-06-10 11 views
5

La prego di dirmi il motivo per cui è considerato come "non divinatorio" quando ho bisogno l'indice e il valore quando loop su una lista e l'uso:Pythonic: gamma vs enumerate in python ciclo for

a = [1,2,3] 
for i in range(len(a)): 
    # i is the idx 
    # a[i] is the value 

ma piuttosto si consiglia di utilizzare

for idx, val in enumerate(a): 
    print idx, val 

che definisce "divinatorio" e perché è quest'ultimo uno migliore? Voglio dire, non è molto meglio per quanto riguarda la leggibilità, vero?

Grazie in anticipo

+2

Possibile dupe di http://stackoverflow.com/questions/11901081/only-index-needed-enumerate-or-xrange – dano

+0

* Voglio dire che non è molto meglio per quanto riguarda la leggibilità, è vero? * * In realtà lo è, perché il primo esempio utilizza una riga aggiuntiva del codice –

+1

Voting per riaprire. Dipende in parte dalle opinioni, ma ci sono buone ragioni per preferire la seconda versione, come mostrato nella risposta di @ ThiefMaster. – juanchopanza

risposta

7

Prima di tutto, il primo modo è brutto: Si sia bisogno di un incarico variabile separata per ottenere l'elemento o utilizzare a[i] tutto il tempo che potrebbe teoricamente essere un'operazione costosa. Immaginate che a sia un cursore di database: quando lo si itera (viene chiamato a.__iter__) l'oggetto può tranquillamente presumere che si sta andando a scorrere su tutti i suoi elementi. Quindi tutte o almeno più righe possono essere recuperate contemporaneamente. Quando ottenere la lunghezza tale ottimizzazione sarebbe stupida, anche se sicuramente non si desidera recuperare i dati solo perché si desidera il numero di elementi. Inoltre, quando si recupera un articolo specifico non si può presumere che anche altri elementi verranno recuperati.

Inoltre, utilizzando enumerate() lavori con qualsiasi iterabile mentre range(len()) funziona solo con numerabili, indicizzabili oggetti.

+0

Grazie, specialmente l'ultimo paragrafo è un buon motivo per me perché altrimenti dovrei sempre usare versioni diverse che sarebbero controproducenti e irregolare. Penso che sia meglio e più pulito usare sempre lo stesso :-) –

+0

enumerate è più veloce quando si desidera accedere ripetutamente all'elenco/elementi iterabili al proprio indice. Quando vuoi solo una lista di indici, è più veloce usare len() e range (xrange in Python 2.x). –