No Python 2.6 ou mais recente:
Se você deseja StopIteration
aumentar, se nenhum elemento correspondente for encontrado:
next(x for x in the_iterable if x > 3)
Se você deseja default_value
(por exemplo None
) retornar em vez disso:
next((x for x in the_iterable if x > 3), default_value)
Observe que você precisa de um par extra de parênteses em torno da expressão do gerador nesse caso - eles são necessários sempre que a expressão do gerador não for o único argumento.
Vejo a maioria das respostas ignorando resolutamente o next
built-in e, portanto, presumo que, por algum motivo misterioso, eles estejam 100% focados nas versões 2.5 e anteriores - sem mencionar o problema da versão do Python (mas não vejo essa menção em as respostas que fazer mencionar o next
built-in, que é por isso que eu pensei que é necessário dar uma resposta a mim mesmo - pelo menos a questão "versão correta" fica no registro desta forma ;-).
Na versão 2.5, o .next()
método dos iteradores aumenta imediatamente StopIteration
se o iterador terminar imediatamente - ou seja, para o seu caso de uso, se nenhum item no iterável atender à condição. Se você não se importa (você sabe que deve haver pelo menos um item satisfatório), basta usar .next()
(melhor em um genexp, linha para o next
built-in no Python 2.6 e melhor).
Se você fazer o cuidado, as coisas embrulho em uma função como você tinha indicado pela primeira vez em sua Q parece melhor, e enquanto a implementação da função que você propôs é muito bem, você pode usar como alternativa itertools
, um for...: break
loop, ou um genexp, ou try/except StopIteration
como o corpo da função , como várias respostas sugeridas. Não há muito valor agregado em nenhuma dessas alternativas, então eu usaria a versão extremamente simples que você propôs pela primeira vez.