palabras iteradores generadores generador funcion explicacion creacion codigo python exception generator stopiteration

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)