В 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-версии (но тогда я не вижу упоминания в ответах, что do упоминает встроенный next
, поэтому я подумал, что необходимо дать ответ сам - по крайней мере, "правильный" версия "проблема попадает на запись таким образом; -).
В 2.5 метод итераторов .next()
немедленно вызывает StopIteration
, если итератор немедленно завершает работу, т. Е. Для вашего случая использования, если ни один элемент в итерации не удовлетворяет условию. Если вам все равно (то есть вы знаете, что должен быть хотя бы одним удовлетворительным элементом), тогда просто используйте .next()
(лучше всего для genexp, строка для next
встроенного в Python 2.6 и лучше).
Если вы делаете заботу, лучше всего обернуть вещи в функцию, как вы сначала указали в Q, и, хотя реализация функции, которую вы предложили, просто прекрасна, вы можете альтернативно использовать itertools
, a for...: break
loop, или genexp, или try/except StopIteration
в качестве тела функции, как предлагали различные ответы. Ни в одной из этих альтернатив нет особой выгоды, поэтому я бы выбрал совершенно простую версию, которую вы впервые предложили.