Bestimmen der Leerheit eines Generators
In Python sind Generatoren ein leistungsstarkes Werkzeug für die verzögerte Auswertung und Iteration über große Datensätze. Allerdings stellt die Feststellung, ob ein Generator leer ist, aufgrund seiner dynamischen Natur eine besondere Herausforderung dar. Im Gegensatz zu Listen oder Tupeln haben Generatoren kein Größenattribut, und eine einfache Iteration über sie würde zu einer StopIteration-Ausnahme führen.
Peek vs. HasNext
Einige schlagen vielleicht vor Verwenden der Funktion peek(), um zu überprüfen, ob ein Generator Elemente enthält. Mit peek() können Sie zwar das erste Element eines Generators abrufen, ohne es zu verbrauchen, es bietet jedoch keine Möglichkeit festzustellen, ob der Generator leer ist. Dies liegt daran, dass peek() eine StopIteration-Ausnahme auslöst, wenn der Generator leer ist, die nicht von der Ausnahme zu unterscheiden ist, die ausgelöst würde, wenn versucht würde, über einen leeren Generator zu iterieren.
Ähnlich ist die Funktion hasNext() im Allgemeinen in Java gefunden, ist in Python-Generatoren nicht verfügbar.
Von Anfang an auf Leere prüfen
Um festzustellen, ob ein Generator von Anfang an leer ist, können Sie a verwenden Benutzerdefinierte Funktion wie die in der Antwort bereitgestellte:
def peek(iterable):
try:
first = next(iterable)
except StopIteration:
return None
return first, itertools.chain([first], iterable)
Diese Funktion ruft das erste Element des Generators ab und gibt None zurück, wenn der Generator leer ist. Außerdem bleibt der Status des Generators erhalten, indem eine geänderte Version zurückgegeben wird, die das erste Element enthält.
Verwendung
Um diese Funktion zu verwenden, können Sie sie mit dem Generator als aufrufen Argument:
res = peek(mysequence)
if res is None:
# sequence is empty. Do stuff.
else:
first, mysequence = res
# Do something with first, maybe?
# Then iterate over the sequence:
for element in mysequence:
# etc.
Mit dieser Prüfung können Sie feststellen, ob der Generator leer ist, und den leeren Fall entsprechend behandeln, bevor Sie darüber iterieren.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3