Je me demandais si il y a une raison qu'il n'y a pas d' first(iterable)
dans le Python intégré dans les fonctions de, quelque peu similaire à l' any(iterable)
et all(iterable)
(il peut être glissé dans un stdlib module quelque part, mais je ne vois pas en itertools
). first
effectuer un court-circuit générateur d'évaluation, de telle sorte que les inutiles (et un nombre potentiellement infini d'opérations peuvent être évités; c'est à dire
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')
De cette façon, vous pouvez exprimer des choses comme:
denominators = (2, 3, 4, 5)
lcd = first(i for i in itertools.count(1)
if all(i % denominators == 0 for denominator in denominators))
Clairement, vous ne pouvez pas faire list(generator)[0]
dans ce cas, puisque le générateur n'est pas arrêter.
Ou si vous avez un tas de regexes de match contre (utile quand ils ont tous le même groupdict
interface):
match = first(regex.match(big_text) for regex in regexes)
Vous économisez beaucoup d'inutiles de traitement en évitant list(generator)[0]
et de court-circuit sur une correspondance positive.