Ich frage mich, ob es einen Grund gibt, warum es first(iterable)
in den in Python integrierten Funktionen keine gibt , ähnlich wie any(iterable)
und all(iterable)
(es kann irgendwo in einem stdlib-Modul versteckt sein, aber ich sehe es nicht in itertools
). first
würde eine Kurzschlussgeneratorauswertung durchführen, so dass unnötige (und möglicherweise unendlich viele) Operationen vermieden werden können; dh
def identity(item):
return item
def first(iterable, predicate=identity):
for item in iterable:
if predicate(item):
return item
raise ValueError('No satisfactory value found')
Auf diese Weise können Sie Dinge ausdrücken wie:
denominators = (2, 3, 4, 5)
lcd = first(i for i in itertools.count(1)
if all(i % denominators == 0 for denominator in denominators))
Offensichtlich können Sie nicht tun , list(generator)[0]
in diesem Fall, da der Generator nicht beendet.
Oder wenn Sie eine Reihe von regulären Ausdrücken haben, mit denen Sie übereinstimmen können (nützlich, wenn alle dieselbe groupdict
Benutzeroberfläche haben):
match = first(regex.match(big_text) for regex in regexes)
Sie sparen viel unnötige Verarbeitung, indem Sie list(generator)[0]
eine positive Übereinstimmung vermeiden und kurzschließen.