En Python 2.6 ou plus récent:
Si vous souhaitez StopIteration
être relevé si aucun élément correspondant n'est trouvé:
next(x for x in the_iterable if x > 3)
Si vous souhaitez default_value
(par exemple None
) être retourné à la place:
next((x for x in the_iterable if x > 3), default_value)
Notez que vous avez besoin d'une paire de parenthèses supplémentaires autour de l'expression de générateur dans ce cas - elles sont nécessaires chaque fois que l'expression de générateur n'est pas le seul argument.
Je vois que la plupart des réponses ignorent résolument le next
intégré et je suppose donc que pour une raison mystérieuse, ils sont 100% concentrés sur les versions 2.5 et antérieures - sans mentionner le problème de la version Python (mais je ne vois pas cette mention dans les réponses qui font mention du next
, intégré qui est la raison pour laquelle je pensais qu'il est nécessaire de fournir une réponse moi - même - au moins la question « version correcte » obtient enregistrée cette façon ;-).
En 2.5, la .next()
méthode des itérateurs augmente immédiatement StopIteration
si l'itérateur se termine immédiatement - c'est-à-dire, pour votre cas d'utilisation, si aucun élément de l'itérable ne satisfait la condition. Si vous ne vous en souciez pas (c'est-à-dire que vous savez qu'il doit y avoir au moins un élément satisfaisant), alors utilisez-le .next()
(mieux sur un genexp, ligne pour le next
Python 2.6 intégré et mieux).
Si vous vous en souciez, envelopper les choses dans une fonction comme vous l'aviez indiqué dans votre Q semble le mieux, et bien que l'implémentation de la fonction que vous avez proposée soit très bien, vous pouvez également utiliser itertools
, une for...: break
boucle, ou un genexp, ou un try/except StopIteration
comme corps de la fonction , comme l'ont suggéré diverses réponses. Il n'y a pas beaucoup de valeur ajoutée dans aucune de ces alternatives, donc j'opterais pour la version simple et simple que vous avez proposée en premier.