In Python 2.6 o versioni successive:
Se vuoi StopIteration
essere sollevato se non viene trovato alcun elemento corrispondente:
next(x for x in the_iterable if x > 3)
Se invece vuoi default_value
(ad esempio None
) essere restituito:
next((x for x in the_iterable if x > 3), default_value)
Si noti che in questo caso è necessaria una coppia di parentesi aggiuntiva attorno all'espressione del generatore: sono necessarie ogni volta che l'espressione del generatore non è l'unico argomento.
Vedo che la maggior parte delle risposte ignora risolutamente il next
built-in e quindi presumo che per qualche misteriosa ragione siano focalizzate al 100% sulle versioni 2.5 e precedenti - senza menzionare il problema della versione di Python (ma poi non vedo quella menzione in le risposte che fanno parlare dellanext
built-in, che è il motivo per cui ho ritenuto necessario per fornire una risposta me stesso - almeno la questione "versione corretta" ottiene il disco in questo modo ;-).
In 2.5, il .next()
metodo degli iteratori aumenta immediatamente StopIteration
se l'iteratore termina immediatamente, ovvero, per il tuo caso d'uso, se nessun elemento nell'iterabile soddisfa la condizione. Se non ti interessa (ad esempio, sai che ci deve essere almeno un elemento soddisfacente), usa semplicemente .next()
(meglio su un genexp, linea per il next
Python 2.6 integrato e meglio).
Se fai attenzione, le cose di avvolgimento in una funzione come avevate prima indicato nel vostro Q sembra migliore, e mentre l'implementazione della funzione avete proposto va bene, si può utilizzare in alternativa itertools
, un for...: break
loop, o un genexp, o try/except StopIteration
come il corpo della funzione , come suggerito da varie risposte. Non c'è molto valore aggiunto in nessuna di queste alternative, quindi sceglierei la versione assolutamente semplice che hai proposto per la prima volta.