W Python 2.6 lub nowszym:
Jeśli chcesz StopIteration
zostać podniesiony, jeśli nie znaleziono pasującego elementu:
next(x for x in the_iterable if x > 3)
Jeśli zamiast tego chcesz default_value
(np. None
) Zostać zwrócony:
next((x for x in the_iterable if x > 3), default_value)
Zauważ, że w tym przypadku potrzebujesz dodatkowej pary nawiasów wokół wyrażenia generatora - są one potrzebne, gdy wyrażenie generatora nie jest jedynym argumentem.
Widzę, że większość odpowiedzi zdecydowanie ignoruje next
wbudowane, więc zakładam, że z jakiegoś tajemniczego powodu są one w 100% skoncentrowane na wersjach 2.5 i starszych - nie wspominając o problemie z wersją Pythona (ale potem nie widzę tej wzmianki w odpowiedzi, które wspominają o next
wbudowanym, dlatego uważam, że konieczne jest udzielenie odpowiedzi osobiście - przynajmniej w ten sposób rejestruje się problem „poprawnej wersji” ;-).
W wersji 2.5 .next()
metoda iteratorów natychmiast się podnosi, StopIteration
jeśli iterator natychmiast się kończy - tj. W twoim przypadku użycia, jeśli żaden element iteracji nie spełnia warunku. Jeśli cię to nie obchodzi (tzn. Wiesz, że musi istnieć co najmniej jeden zadowalający element), po prostu użyj .next()
(najlepiej na geneksie, linii dla next
wbudowanego w Pythonie 2.6 i lepszych).
Jeśli zrobić opieki, rzeczy owijania w funkcji, jak po raz pierwszy wskazano w Q wydaje się najlepiej, a jednocześnie realizacja funkcji, którą zaproponował jest dobrze, można alternatywnie użyć itertools
, a for...: break
pętlę, lub genexp lub try/except StopIteration
jako ciała danej funkcji , jak sugerują różne odpowiedzi. Żadna z tych alternatyw nie ma dużej wartości dodanej, więc wybrałbym bardzo prostą wersję, którą pierwszy raz zaproponowałeś.