2010-09-06 16 views
5

ich für Schleifen ein Rookie Bastler und ich Nest bin, wenn ich Python schreiben, etwa so:Python: Verschachtelte for-Schleifen oder „next“ Anweisung

dict = { 
    key1: {subkey/value1: value2} 
    ... 
    keyn: {subkeyn/valuen: valuen+1} 
    } 

for key in dict: 
    for subkey/value in key: 
     do it to it 

Ich bin mir dessen bewusst ein „next“ Schlüsselwort, das würde das gleiche Ziel in einer Zeile erreichen (Ich stellte eine Frage, wie man es benutzt, aber ich habe es nicht ganz verstanden).

Also für mich ist eine verschachtelte for-Schleife viel besser lesbar. Warum benutzen die Leute dann "next"? Ich habe irgendwo gelesen, dass Python eine dynamisch typisierte und interpretierte Sprache ist und weil + sowohl Strings als auch Summenzahlen konkontiniert, dass es Variablentypen für jede Schleifeniteration prüfen muss, um zu wissen, was die Operatoren sind, usw. Verhindert die Verwendung von "next" Dies in gewisser Weise, Beschleunigung der Ausführung oder ist es nur eine Frage der Stil/Vorliebe?

Antwort

20

next ist wertvoll einen Iterator wenn nötig, ohne diesen Fortschritt voran eine explizite for Schleife steuert. Zum Beispiel, wenn Sie wollen "das erste Element in S, das ist größer als 100", next(x for x in S if x > 100) wird es Ihnen geben, keine Muss, keine Aufregung, keine unnötige Arbeit (wie alles endet, sobald eine geeignete x befindet) - und Sie erhalten eine Ausnahme (StopIteration), wenn unerwartet keine x die Bedingung erfüllt. Wenn ein No-Match erwartet wird und Sie None in diesem Fall wünschen, wird next((x for x in S if x > 100), None) das liefern. Zu diesem speziellen Zweck könnte es für Sie klarer sein, wenn next eigentlich first genannt wurde, aber das würde seine viel allgemeinere Verwendung verraten. B. die Zusammenführung mehrerer Sequenzen (z. B. eine Vereinigung oder Schnittmenge sortierter Sequenzen - z. B. sortierte Dateien, bei denen es sich bei den Elementen um Linien handelt). Auch hier ist next genau das, was der Arzt bestellt hat, weil keine der Sequenzen über die anderen dominieren kann, indem man A "main for loop" steuert. Also, unter der Annahme der Einfachheit keine Duplikate existieren können (ein Zustand, der nicht schwer ist, wenn nötig zu entspannen), halten Sie Paare (currentitem, itsfile) in einer Liste von heapq gesteuert, und die Zusammenführung wird einfach ... aber nur dank der Magie von next zu fördern die korrekte Datei, sobald ihr Artikel verwendet wurde, und nur diese Datei.

import heapq 

def merge(*theopentextfiles): 
    theheap = [] 
    for afile in theopentextfiles: 
     theitem = next(afile, '') 
     if theitem: theheap.append((theitem, afile)) 
    heapq.heapify(theheap) 
    while theheap: 
     theitem, afile = heapq.heappop(theheap) 
     yielf theitem 
     theitem = next(afile, '') 
     if theitem: heapq.heappush(theheap, (theitem, afile)) 

Gerade versuchen alles und überall dieses elegante ohne next zu tun ...! -)

One für eine lange Zeit weitergehen könnte, aber die beiden „Use Cases einen Iterator um einen Platz vorrücken (ohne es eine ganze for Schleife zu steuern) "und" nur das erste Element aus einem Iterator "Konto für die wichtigsten Anwendungen von next.

+0

+1 Schöne Antwort! –

+0

@AJ, danke! –

+0

+1 Sie haben es wieder getan. Ich habe gerade gemerkt, dass mein Nützliches, jedes Aka zuerst definiert werden konnte (das erste nicht falsch in irgendeiner Sequenz oder der letzte Wert in der Sequenz, wenn alle falsch sind) könnte auch mit next und iter definiert werden. –

Verwandte Themen