2014-06-10 2 views
5

Können Sie mir bitte sagen, warum es als „nicht pythonic“ betrachtet wird, wenn ich den Index und den Wert benötigen, wenn sie über eine Liste und Verwendung Looping:Pythonic: range vs enumerate in Python for-Schleife

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

aber eher ist es zu empfehlen

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

wer definiert "pythonic" und warum ist letzteres besser? Ich meine, es ist nicht viel besser in Bezug auf Lesbarkeit, oder?

Vielen Dank im Voraus

+2

Mögliche Betrüger von http://stackoverflow.com/questions/11901081/only-index-needed-enumerate-or-xrange – dano

+0

* Ich meine, es ist nicht viel besser in Bezug auf Lesbarkeit, ist es!? * Es ist tatsächlich, weil das erste Beispiel eine zusätzliche Codezeile –

+1

Voting zum erneuten Öffnen verwendet. Bis zu einem gewissen Grad hängt es von den Meinungen ab, aber es gibt gute Gründe, die zweite Version zu bevorzugen, wie in der Antwort von @ ThiefMaster gezeigt. – juanchopanza

Antwort

7

Zunächst einmal ist der erste Weg, hässlich: Sie müssen entweder eine separate variable Zuordnung das Element oder a[i] die ganze Zeit zu benutzen, die theoretisch eine teuere Operation sein. Stellen Sie sich a als Datenbank-Cursor vor: Wenn Sie es iterieren (a.__iter__ wird aufgerufen), kann das Objekt sicher davon ausgehen, dass Sie über alle seine Elemente iterieren werden. So können alle oder mindestens mehrere Zeilen gleichzeitig abgerufen werden. Wenn man die Länge erreicht, wäre eine solche Optimierung zwar blöd, da man Daten sicher nicht abrufen will, nur weil man die Anzahl der Elemente haben möchte. Beim Abrufen eines bestimmten Artikels können Sie nicht davon ausgehen, dass auch andere Artikel abgerufen werden.

Zusätzlich mit enumerate() Arbeiten mit jedem iterable während range(len()) funktioniert nur mit zählbar, Wende Objekten.

+0

Danke, besonders dein letzter Absatz ist ein sehr guter Grund für mich, weil ich sonst immer verschiedene Versionen verwenden müsste, die kontraproduktiv wären und irregulär. Ich denke, es ist besser und sauberer, immer dasselbe zu verwenden :-) –

+0

Enumerate ist schneller, wenn Sie wiederholt auf die Liste/iterable Elemente an ihrem Index zugreifen möchten. Wenn Sie nur eine Liste von Indizes möchten, ist es schneller, len() und range (xrange in Python 2.x) zu verwenden. –