В Python 2.6 или новее:
Если вы хотите StopIterationбыть поднятым, если соответствующий элемент не найден:
next(x for x in the_iterable if x > 3)
Если вы хотите default_value(например None) быть возвращенным вместо:
next((x for x in the_iterable if x > 3), default_value)
Обратите внимание, что в этом случае вам нужна дополнительная пара скобок вокруг выражения генератора - они нужны, когда выражение генератора не является единственным аргументом.
Я вижу, что большинство ответов решительно игнорируют nextвстроенные функции, и поэтому я предполагаю, что по какой-то таинственной причине они на 100% ориентированы на версии 2.5 и старше - без упоминания проблемы с Python-версией (но тогда я не вижу этого упоминания в ответы, в которых упоминается nextвстроенная функция, поэтому я решил, что необходимо дать ответ сам - по крайней мере, проблема с «правильной версией» регистрируется таким образом ;-).
В 2.5 .next()метод итераторов немедленно повышается, StopIterationесли итератор немедленно завершается - т. Е. Для вашего случая использования, если ни один элемент в итерируемом не удовлетворяет условию. Если вам все равно (то есть вы знаете, что должен быть хотя бы один удовлетворительный элемент), тогда просто используйте .next()(лучше всего для genexp, строка для nextвстроенного в Python 2.6 и лучше).
Если вы делаете уход, упаковка вещей в функции , как вы впервые указаны в вашем Q кажется лучшим, и в то время как реализация функции вы предложили просто отлично, можно альтернативно использовать itertools, в for...: breakпетлю, или genexp, или try/except StopIterationкак тело функции , как предложили различные ответы. Ни в одной из этих альтернатив нет особой выгоды, поэтому я бы остановился на совершенно простой версии, которую вы впервые предложили.