В 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
как тело функции , как предложили различные ответы. Ни в одной из этих альтернатив нет особой выгоды, поэтому я бы остановился на совершенно простой версии, которую вы впервые предложили.