iteradores - python funcion yield
¿Cómo puedo hacer que un generador de Python devuelva Ninguno en lugar de StopIteration? (2)
Puede encadenar el generador con (Ninguno,):
from itertools import chain
a = [1,2,3,4]
print chain((i for i, v in enumerate(a) if v == 6), (None,)).next()
pero creo que a.index (2) no atravesará la lista completa, cuando se encuentra 2, la búsqueda ha finalizado. puedes probar esto
>>> timeit.timeit("a.index(0)", "a=range(10)")
0.19335955439601094
>>> timeit.timeit("a.index(99)", "a=range(100)")
2.1938486138533335
Estoy usando generadores para realizar búsquedas en listas como este simple ejemplo:
>>> a = [1,2,3,4]
>>> (i for i, v in enumerate(a) if v == 4).next()
3
(Solo para enmarcar un poco el ejemplo, estoy usando listas mucho más largas en comparación con la anterior, y las entradas son un poco más complicadas que int
. Lo hago de esta manera para que las listas completas no se recorran cada vez Los busco
Ahora, si en cambio lo cambiara a i == 666
, devolvería un StopIteration
porque no puede encontrar ninguna entrada 666
en a
.
¿Cómo puedo hacer que devuelva None
lugar? Por supuesto, podría envolverlo en un try ... except
cláusula, pero ¿hay una forma más pitónica de hacerlo?
Si está utilizando Python 2.6+, debe usar la next
función incorporada, no el next
método (que se reemplazó con __next__
en 3.x). La next
incorporada toma un argumento predeterminado opcional para devolver si el iterador está agotado, en lugar de generar StopIteration
:
next((i for i, v in enumerate(a) if i == 666), None)