У 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
як тіло функції , як запропонували різні відповіді. Жодна з цих альтернатив не має великої доданої вартості, тому я б хотів отримати надзвичайно просту версію, яку ви вперше запропонували.