for python iterator generator enumerate

for - enumerate()-ing a un generador en Python



python function introspection (3)

Es incluso más fácil de decir que cualquiera de las sugerencias anteriores:

$ python Python 2.5.5 (r255:77872, Mar 15 2010, 00:43:13) [GCC 4.3.4 20090804 (release) 1] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> abc = (letter for letter in ''abc'') >>> abc <generator object at 0x7ff29d8c> >>> numbered = enumerate(abc) >>> numbered <enumerate object at 0x7ff29e2c>

Si la enumeración no realizó una evaluación perezosa, devolvería [(0,''a''), (1,''b''), (2,''c'')] o algún equivalente (casi).

Por supuesto, enumerar es realmente solo un generador de fantasía:

def myenumerate(iterable): count = 0 for _ in iterable: yield (count, _) count += 1 for i, val in myenumerate((letter for letter in ''abc'')): print i, val

Me gustaría saber qué sucede cuando paso el resultado de una función de generador a enumerate () de python. Ejemplo:

def veryBigHello(): i = 0 while i < 10000000: i += 1 yield "hello" numbered = enumerate(veryBigHello()) for i, word in numbered: print i, word

¿Es la enumeración iterada perezosamente, o arrastra todo a la primera? Estoy seguro al 99.999% de que es perezoso, ¿puedo tratarlo exactamente igual que la función del generador, o tengo que estar atento a algo?


Es perezoso Es bastante fácil probar que ese es el caso:

>>> def abc(): ... letters = [''a'',''b'',''c''] ... for letter in letters: ... print letter ... yield letter ... >>> numbered = enumerate(abc()) >>> for i, word in numbered: ... print i, word ... a 0 a b 1 b c 2 c


Ya que puede llamar a esta función sin salir de las excepciones de memoria, definitivamente es perezoso

def veryBigHello(): i = 0 while i < 1000000000000000000000000000: yield "hello" numbered = enumerate(veryBigHello()) for i, word in numbered: print i, word