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
.
+1 Schöne Antwort! –
@AJ, danke! –
+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. –